Python Language Scrivi il tuo gestore di contesto


Esempio

Un gestore di contesto è un qualsiasi oggetto che implementa due metodi magici __enter__() e __exit__() (sebbene possa implementare anche altri metodi):

class AContextManager():

    def __enter__(self):
        print("Entered")
        # optionally return an object
        return "A-instance"

    def __exit__(self, exc_type, exc_value, traceback):
        print("Exited" + (" (with an exception)" if exc_type else ""))
        # return True if you want to suppress the exception

Se il contesto esce con un'eccezione, le informazioni su exc_type verranno passate come triplo exc_type , exc_value , traceback (queste sono le stesse variabili restituite dalla funzione sys.exc_info() ). Se il contesto esce normalmente, tutti e tre questi argomenti saranno None .

Se si verifica un'eccezione e viene passata al metodo __exit__ , il metodo può restituire True per sopprimere l'eccezione, altrimenti l'eccezione verrà __exit__ alla fine della funzione __exit__ .

with AContextManager() as a:
    print("a is %r" % a)
# Entered
# a is 'A-instance'
# Exited

with AContextManager() as a:
    print("a is %d" % a)
# Entered
# Exited (with an exception)
# Traceback (most recent call last):
#   File "<stdin>", line 2, in <module>
# TypeError: %d format: a number is required, not str

Si noti che nel secondo esempio anche se si verifica un'eccezione nel mezzo del corpo __exit__ with, il gestore __exit__ viene ancora eseguito, prima che l'eccezione si propaga all'ambito esterno.

Se hai solo bisogno di un metodo __exit__ , puoi restituire l'istanza del gestore di contesto:

class MyContextManager:
    def __enter__(self):
        return self

    def __exit__(self):
        print('something')