2015-12-17 6 views
0

Я хотел бы получить if, with или альтернативный оператор, чтобы не вводить блок при условии с побочным эффектом, например. похожее на это:Прерывать блок с переменной и не поднимать?

with sometimes_run_block() as value: 
    print('this should only sometimes run', value) 

с контекстом заявление выглядит следующим образом:

@contextmanager 
def sometimes_run_block(): 
    if random.random() > 0.5: 
     yield 'hello!' 
    else: 
     yield 

На данный момент я не имею ничего уступая моей @contextmanager украшенной функции и проверки, если значение не None. Мне кажется излишним иметь чек экстракта, заставляя его быть три линии и два уровня отступа:

with sometimes_run_block() as value: 
    if value: 
     print('this should only sometimes run', value) 

Другой альтернатива не использует with:

value = sometimes_run_block() 
if value: 
    print('this should only sometimes run', value) 

текущих рабочие двухлинейную решение заключается в использовании инструкции for, но это вводит в заблуждение.

for value in sometimes_run_block(): 
    print('this should only sometimes run', value) 

Можно ли пропустить обработку контекстного блока (как если бы это было if заявления), но не поднимая исключение, вводя переменный контекст?

+4

Это не совсем то, что делает оператор 'with' для или для .. Развертывание выполнения выполняется с помощью оператора' if'. –

+0

Если вы хотите получить фантазию, вы можете использовать декоратор, возможно, но для удобочитаемости предпочтительнее условие if. Есть ли какая-то причина, по которой нужно принимать решение в контекст-менеджере? – memoselyk

+0

@memoselyk Не должно быть, просто две линии, делающие это, были бы хороши, как я предполагал. –

ответ

2

Простой способ является лучшим способом:

value = sometimes_run_block() 
if value: 
    print('this should only sometimes run', value) 

Это Python, в конце концов - мы, как правило, не гнаться циклы, мы не ценим краткость над четкостью. Если вы хотите сделать что-то нелепые, это зависит от вас, но кто бы ни поддерживал ваш код позже, мы надеемся выяснить, как его отменить, пока он не сгонит их.

+0

Мне нравится ваш ответ, но следует указать, что он должен переопределить 'иногда_run_block()', чтобы удалить декоратор 'contextmanager' и сменить операторы' yield' на 'return'. – iLoveTux