Как я могу условно выполнить код в блоке «с»?
-
05-07-2019 - |
Вопрос
Я думаю, что это своего рода злоупотребление функцией, но мне все еще интересно, можно ли это сделать... Я хочу сделать что-то вроде:
with conditional(a):
print 1
таким образом print 1
часть выполняется только в том случае, если a==True.Это возможно?
РЕДАКТИРОВАТЬ:Как утверждают люди ниже, это ужасный стиль.Это просто загадка\вопрос.Не пытайтесь повторить это дома, это не для слабонервных и т. д.
Решение
Нет реальной причины делать это, поскольку условные выражения уже предоставляются с использованием if
заявление:
if a == True:
print 1
Но если вы просто просите веселье, ответ ты не можешь Действительно.Чтобы остановить with
контент от выполнения, conditional
нужно будет как-то остановить выполнение, в его __enter__
метод.Но единственный способ сделать это — вызвать исключение, что означает, что никакой другой код не будет запущен, если вы не обернете with
с try
заявление о рассмотрении дел a != True
Редактировать: видя, что меня привлекли к ответственности в комментариях и голосовании за использование условия ОП (a == True
) Я подумывал изменить его на if a
, что, конечно же, является идиомой в Python для проверки условий.Но мы не знать что имел в виду ОП и действительно ли он хочет a
быть логическим значением и не хочет, чтобы блок выполнялся, если a = [1]
(что пройдет if a
) Я решил оставить все как есть.
Другие советы
if a is True:
print 1
with
заявление предназначен для обеспечения надежного контекста входа-выхода.
Единственный способ, который я вижу, - это вызвать исключение в conditional
если его аргумент ложен.В with
тело не будет выполнено, как и весь последующий код - до тех пор, пока except
или finally
оговорка, конечно.
Допустим, у меня есть класс A с функциями __enter__ и __exit__:
class A:
def __init__(self, i):
self.b = i
def __exit__(*args, **kwargs):
print "exit"
def __enter__(*args, **kwargs):
print "enter"
И функция B, которая будет проверять, равно ли b в объекте c 1, иначе она пройдет.
def b(c):
if c.b == 1:
return c
else:
pass
Я могу добиться:
with b(A(1)):
print 10
enter
10
exit
Но он выдаст AttributeError, если b пройдет как с работать будет не с чем.Решением было бы поставить with b(A(1)):
внутри блока try/кроме.Но я не рекомендую этого делать.