2014-11-04 8 views
2

외부 클래스 인스턴스에서 호출되는 외부 클래스 메서드 만 다른 일련의 클래스 메서드에서 try/except1/except2/etc 블록이 반복적으로 반복됩니다.파이썬 2.7에서 어떻게 클래스 인스턴스 메소드를 래핑하거나 try/except 블록으로 꾸밀 수 있습니까?

class MyClass(object): 
    def __init__(self): 
     self.arg = 'foo' 

    def method1(self, arg1): 
     err = -1 
     y = None 
     try: 
      x = AnOutsideClass(self.arg)  # Creates a class instance of an imported class 
      y = x.outsideclassmethod1(arg1) # Calls an instance method that returns another different class instance 
     except MyException1: 
      x.dosomething() # Needed to handle error 
     except MyException2: 
      err = 0 
     finally: 
      del x 
     return y, err 

    def method2(self, arg1, arg2, arg3): 
     err = -1 
     y = None 
     try: 
      x = AnOutsideClass(self.arg) 
      y = x.outsideclassmethod2(arg1, arg2, arg3) # This is the only thing changed 
                 # A different method with different argument requirements 
     except MyException1: 
      x.dosomething() 
     except MyException2: 
      err = 0 
     finally: 
      del x 
     return y, err 

    def method3 ... 

내가 랩을 시도하여이 코드를 응축의 다양한 방법을 시도하고있다 : 다음은 단순화 된 버전 (호출되는 인스턴스 만의 방법으로 차이가 나는 처리하고 4 개 예외 팔 개 방법이 실제로있다)이다 try : 중첩 된 함수, 데코레이터 등을 사용하여 코드의 try : 부분에있는 두 문장은 있지만 다른 이유로 인해이 예제를 번역하는 데 문제가 있다는 사실 때문에 실패한 것 같습니다. 1) 필요한 클래스 인스턴스를 만드는 중입니다. 나중에 예외 블록 중 하나에서 사용하고 2) 인스턴스 메소드를 호출하고 3) 인스턴스 메소드의 결과를 리턴해야합니다.

functools 또는 설명자 또는 기타 수단에서 부분적으로이를 수행하는 방법이 있습니까? 래퍼 함수에서 사용하는 정수 코드를 기반으로 인스턴스 메서드를 선택하는 확장 된 if/elif 블록이있는 clunky 구현을 가지고 있지만보다 우아한 방법이 있어야한다고 생각합니다. 나는 상대적으로 파이썬을 처음 접했고 손실은 ...

답변

2

함수 팩터 리 (함수를 반환하는 함수)를 사용할 수 있습니다.

def make_method(methname): 
    def method(self, *args): 
     err = -1 
     y = None 
     try: 
      x = AnOutsideClass(self.arg)  # Creates a class instance of an imported class 
      y = getattr(x, methname)(*args) # Calls an instance method that returns another different class instance 
     except MyException1: 
      x.dosomething() # Needed to handle error 
     except MyException2: 
      err = 0 
     finally: 
      del x 
     return y, err 
    return method 

class MyClass(object): 
    def __init__(self): 
     self.arg = 'foo' 
    method1 = make_method('outsideclassmethod1') 
    method2 = make_method('outsideclassmethod2') 

make_method에는 외부 메서드 이름이 문자열로 전달됩니다. getattr (method)은 methname 문자열을 사용하여 x에서 실제 메서드를 가져옵니다. getattr(x, 'foo')x.foo과 같습니다.

def method(self, *args)*은 임의의 수의 위치 인수를 허용 할 수 있다고 파이썬에 알립니다. method 안에, args은 튜플입니다. *y = getattr(x, methname)(*args)이며, 파이썬은 args의 요소를 getattr(x, methname)에 의해 반환 된 메소드의 개별 인수로 전달합니다. 포장 풀기 연산자 *the docs, herethis blog에 설명되어 있습니다.