Como posso condicionalmente executar código em um “com” bloco?
-
05-07-2019 - |
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.
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.