Как я могу условно выполнить код в блоке «с»? - PullRequest
0 голосов
/ 27 ноября 2009

Полагаю, это немного злоупотребляет этой функцией, но мне все еще интересно, можно ли это сделать Я хочу сделать что-то вроде:

with conditional(a):
    print 1

, так что часть print 1 выполняется, только если a == True. Возможно ли это?

EDIT: Как утверждают люди ниже, это ужасный стиль. Это просто загадка \ вопрос. Не пытайтесь делать это дома, не для слабонервных и т. Д.

Ответы [ 4 ]

8 голосов
/ 27 ноября 2009

Нет реальной причины для этого, поскольку условные выражения уже поставляются с помощью оператора if:

if a == True:
    print 1

Но, если вы просто просите веселье , ответ будет , вы не можете на самом деле. Чтобы остановить выполнение содержимого with, conditional необходимо каким-то образом остановить выполнение в его методе __enter__. Но единственный способ сделать это - вызвать исключение, что означает, что никакой другой код не будет запущен, если вы не заключите with в оператор try для обработки случаев a != True

Редактировать: видя, что меня обвиняют в комментариях и голосованиях за использование условия ОП (a == True), я подумал об изменении его на if a, что, конечно, идиома в Python для тестирования условных выражений , Но мы не знаем , что имел в виду ОП, и действительно ли он хочет, чтобы a был логическим значением, и не хочет, чтобы блок выполнялся, если a = [1] (который пройдет if a) Я решил оставить все как есть.

4 голосов
/ 27 ноября 2009
if a is True:
    print 1

with оператор предназначен для обеспечения надежного контекста входа-выхода.

2 голосов
/ 27 ноября 2009

Единственный способ, которым я вижу, - вызвать исключение в conditional, если его аргумент равен false. Тело with не будет выполнено, но ни один из следующих кодов не будет выполнен, пока, конечно, не будет оговорка except или finally.

0 голосов
/ 27 ноября 2009

Допустим, у меня есть класс 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 / исключением. Но я не рекомендую делать это.

...