Comment puis-je exécuter du code de manière conditionnelle dans un bloc "avec"?
-
05-07-2019 - |
Question
Je suppose que c'est un peu abuser de la fonctionnalité, mais je suis toujours curieux de savoir si cela pourrait être fait - Je veux faire quelque chose comme:
with conditional(a):
print 1
pour que la partie print 1
ne soit exécutée que si a == True.
Est-ce possible?
EDIT: Comme les gens disent ci-dessous, c'est un style horrible. C'est juste une énigme \ question. N'essayez pas cela à la maison, pas pour les âmes sensibles, etc.
La solution
Il n'y a pas vraiment de raison de le faire, puisque les conditions sont déjà fournies à l'aide de l'instruction si
:
if a == True:
print 1
Toutefois, si vous ne demandez que plaisir , la réponse est vous ne pouvez pas vraiment. Pour arrêter l'exécution du avec le contenu
, conditionnel
devra en quelque sorte arrêter l'exécution, dans sa méthode __ enter __
. Mais le seul moyen de le faire est de générer une exception, ce qui signifie qu'aucun autre code ne sera exécuté, à moins que le ne soit enveloppé de
par une instruction try
pour le traitement des cas . a! = True
Modifier: après avoir été poursuivi en justice dans les commentaires et votes pour avoir utilisé l'état du PO ( a == Vrai
), j'ai envisagé de le changer en si un
, qui est bien sûr l'idiome en Python pour tester les conditions. Mais nous ne savons pas ce que le PO avait à l’esprit et s’il souhaite vraiment que un
soit un booléen et ne souhaite pas que le bloc s’exécute si a = [1]
(qui passera si un
), j'ai décidé de le laisser tel quel.
Autres conseils
if a is True:
print 1
avec
instruction est destiné à fournir un contexte entrée-sortie fiable.
Le seul moyen que je vois est de déclencher une exception dans conditionnel
si son argument est faux. Le code avec
ne sera pas exécuté, pas plus que le code qui suit - jusqu'à ce qu'une clause sauf
ou finally
, bien sûr.
Disons que j'ai la classe A avec une fonction __enter__ et __exit__:
class A:
def __init__(self, i):
self.b = i
def __exit__(*args, **kwargs):
print "exit"
def __enter__(*args, **kwargs):
print "enter"
Et une fonction B qui vérifiera si b dans l’objet c est égal à 1 sinon il passera.
def b(c):
if c.b == 1:
return c
else:
pass
Je peux atteindre:
with b(A(1)):
print 10
enter
10
exit
Mais il générera une erreur AttributeError si b passe, car avec n'aura rien avec lequel travailler.
Une solution serait de placer le avec b (A (1)):
dans un bloc try / except. Mais je ne recommande pas de faire cela.