Comment puis-je exécuter du code de manière conditionnelle dans un bloc "avec"?

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

  •  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.

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top