2017-02-07 12 views
-1

나는 다음과 같은 샘플 기능이 : 나는 with 문 안쪽에 있기 때문에 추가로 들여 쓰기의 전체 함수 본문의 시각적 공간을 잃고 싶지 않아파이썬에서 '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): 
     # ...