Pergunta

Eu acho que isso está abusando meio do recurso, mas ainda estou curioso para saber se isso poderia ser feito - Eu quero fazer algo como:

with conditional(a):
    print 1

para que a parte print 1 é executado somente se a == True. Isso é possível?

EDIT: Como as pessoas afirmam abaixo, este é o estilo horrível. É apenas um enigma \ pergunta. Não tente isso em casa, não para os fracos de coração etc.

Foi útil?

Solução

Não há nenhuma razão real para fazer isso, já que condicionais já são fornecidos usando a instrução if:

if a == True:
    print 1

Mas, se você está apenas pedindo para fun , a resposta é Você não pode realmente. Para parar o conteúdo with de executar, conditional precisará parar de alguma forma de execução, no seu método __enter__. Mas a única maneira que pode fazer isso é levantar uma exceção, o que significa que nenhum outro código será executado, a menos que você enrole a with com uma declaração try para o tratamento de casos a != True

Editar: visto que foi processado nos comentários e votos para usar a condição do OP (a == True) I pensou em mudar-lo para if a, que é, naturalmente, o idioma em Python para testar condicionais. Mas, nós não sei o que o OP tinha em mente, e se ele realmente quer a ser um boolean, e não quer bloco para executar se a = [1] (que passará if a) I < strong> decidiu deixar como está.

Outras dicas

if a is True:
    print 1

with declaração se destina a fornecer introduzir um confiável contexto -exit.

A única maneira que eu vejo é levantar uma exceção no conditional se seu argumento é falso. O corpo with não será executada, mas nem será qualquer código que se segue -. Até uma cláusula except ou finally, é claro

Vamos dizer que eu tenho classe A com um __enter__ e uma função __exit__:

class A:
    def __init__(self, i):
        self.b = i
    def __exit__(*args, **kwargs):
        print "exit"
    def __enter__(*args, **kwargs):
        print "enter"

E uma função B que irá verificar se b em objeto c é igual a 1 então ele irá passar.

def b(c):
    if c.b == 1:
        return c
    else:
        pass

Eu posso alcançar:

with b(A(1)):
    print 10


enter
10
exit

Mas vai lançar uma AttributeError se b passa como o com não terá nada para trabalhar. Uma solução seria colocar o with b(A(1)): dentro de um try / exceto bloco. Mas eu não recomendo fazer isso.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top