Python Language Utiliser un gestionnaire de contexte


Exemple

Une autre manière, très lisible et élégante, mais beaucoup moins efficace qu'une structure if / else, est de construire une classe comme suit, qui lira et stockera la valeur à comparer, s'exposera dans le contexte comme un appelable retournera true s'il correspond à la valeur stockée:

class Switch:
    def __init__(self, value): 
        self._val = value
    def __enter__(self):
        return self
    def __exit__(self, type, value, traceback):
        return False # Allows traceback to occur
    def __call__(self, cond, *mconds): 
        return self._val in (cond,)+mconds

alors la définition des cas correspond presque à la construction réelle du switch / de la case (exposée dans une fonction ci-dessous, pour faciliter la démonstration):

def run_switch(value):
    with Switch(value) as case:
        if case(1):
            return 'one'
        if case(2):
            return 'two'
        if case(3):
            return 'the answer to the question about life, the universe and everything'
        # default
        raise Exception('Not a case!')

Donc, l'exécution serait:

>>> run_switch(1)
one
>>> run_switch(2)
two
>>> run_switch(3)
…
Exception: Not a case!
>>> run_switch(42)
the answer to the question about life, the universe and everything

Nota Bene :