2017-05-12 4 views
4

Je comprends queValeur de retour de __exit__

  • __enter__ et __exit__ sont utilisés pour mettre en œuvre un gestionnaire de contexte. Si une exception se produit dans une instruction with, le type, la valeur et la trace de l'exception sont transmis à la méthode __exit__.

  • __exit__ peut gérer l'exception:

    1. De retour True: l'exception est gracieusement traitée.
    2. De retour toute autre chose: la déclaration with soulève l'exception

je suis tombé sur la méthode __exit__ suivante. La déclaration de retour est-elle redondante?

def __exit__(self, type, value, traceback): 
    self.close() 
    return type == None 

car il me semble que,

  • Si aucune exception est survenue, type sera naturellement None, donc __exit__ renvoie true. Rien n'est soulevé.
  • Si une exception s'est produite, type est défini sur le type d'exception réel, alors __exit__ renvoie la valeur false. L'exception est levée telle quelle.
+1

Il s'agit d'une instruction 'return' qui prête à confusion à plus d'un niveau. N'utilisez jamais '== None' quand vous pouvez utiliser' is None' à la place. Mais oui, supprimez simplement cette ligne 'return' pour tout ce qu'elle vaut. –

+0

Il est également source de confusion lorsque vous nommez l'argument de la méthode 'type'. Parce que 'type' est déjà un mot clé intégré.il est préférable d'utiliser 'exc_type' car il ne confond pas et ne crée pas d'ombre dans le mot-clé build-in. –

Répondre

6

Oui, cette instruction return est redondante. Ce n'est que lorsque type est pasNone que la valeur de retour est importante.

De l'object.__exit__() documentation:

Si une exception est fournie, et la méthode souhaite supprimer l'exception (à savoir l'empêcher de se propager), il doit renvoyer une valeur réelle. Sinon, l'exception sera traitée normalement à la sortie de cette méthode.

Notez qu'une valeur vraie supprimera l'exception; donc 1 ou "Handled!" fonctionnerait aussi, pas seulement True. Si vous supprimez la ligne return, None sera renvoyé à la place et la fonctionnalité restera inchangée. La lisibilité serait améliorée cependant, parce que cette déclaration return type == None est juste confuse sur plusieurs niveaux (pourquoi ne pas utiliser type is None par exemple?).