2017-02-07 2 views
-1

J'ai la fonction exemple suivant:Comment appeler toute la fonction sous l'instruction 'with' en Python?

def Run(self): 
    with self._resource() as r: 
     # a lot of code uses |r| 
     pass 
    # end of 'with' statement 
# end of function body 

Je ne veux pas perdre l'espace visuel de l'ensemble du corps de la fonction à cause de retrait supplémentaire à l'intérieur with déclaration.

Aussi je ne veux pas appeler le _resource() en dehors de la portée de la classe - encapsulation il casse d'une certaine façon, à savoir ce n'est pas une bonne façon:

with obj._resource() as r: 
    obj.Run(r) 

est-il un moyen assez pour exécuter le même code sans perdre d'espace visuel?

Répondre

2

Si vous avez seulement cette fonction à traiter, il est assez simple:

class Foo(object): 
    def Run(self): 
     with self._resource() as r: 
      return self._RunWithResource(r) 

    def _RunWithResource(self, r): 
     # ... 

Si vous voulez répéter le modèle, un décorateur pourrait aider. Plus ou moins:

from functools import wraps 
def with_resource(f): 
    @wraps 
    def wrapper(self, *a, **kw): 
     with self._resource() as r: 
      return f(self, r, *a, **kw) 
    return wrapper 

class Foo(object): 
    @with_resource 
    def Run(self, r): 
     # ...