2017-02-07 7 views
-1

私は、次のサンプル関数があります:私は理由with文の中の追加インデントの全機能本体の視覚的なスペースを失いたくないPythonで 'with'ステートメントで関数全体を呼び出す方法は?

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

を。

また、私はクラスのスコープ外_resource()を呼び出すにしたくない - それはいくつかの方法でカプセル化を壊し、これは良い方法ではありません。すなわち:

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

同じことを実行するための任意のかなりの方法があります視覚的なスペースを失うことなくコード?

答えて

2

あなたがに対処するためにのみ、この機能を持っている場合、それはかなり簡単です:

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

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

あなたはパターンを繰り返したい場合は、デコレータが役立つかもしれません。多かれ少なかれ:

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): 
     # ... 
関連する問題