Как я могу условно выполнить код в блоке «с»?

StackOverflow https://stackoverflow.com/questions/1808675

  •  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/кроме.Но я не рекомендую этого делать.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top