2012-01-13 3 views
8

예외를 잡아 적절하게 기록 할 데코레이터를 만들고 싶습니다.데코레이터가있는 낯설기

def logger(foo): 
    try: 
     print foo() 
    except Exception as e: 
     print e 

@logger 
def d(): 
    return 2/2 

if __name__ == '__main__': 
    d() 

그게 바로 내가 생각,하지만 난 그것을 실행하고이 같은 예외가 있습니다

1 

Traceback (most recent call last): 

    File "log.py", line 14, in <module> 

    d() 

TypeError: 'NoneType' object is not callable 

왜 통역이 날 함수가 없음 유형이 있음을 알 수 있지만, 인쇄 응답 전화를?

+0

[데코레이터 위키 (http://wiki.python.org/moin/PythonDecorators), [PEP-0318] (http://www.python.org/dev/peps/pep-0318/)를 읽어보십시오.) 그리고 마지막으로 [this] (http://docs.python.org/library/functools.html#functools.update_wrapper) – reclosedev

답변

13

데코레이터는 함수를 반환해야하지만 아무 것도 반환하지 않으므로 'TypeError :'NoneType '개체를 호출 할 수 없습니다.' 데코레이터를 사용/작성하는 방법의 좋은 예를 들어 밖으로 This question

def logger(foo): 
    def fn(): 
     try: 
      print foo() 
     except Exception as e: 
      print e 
    return fn 

확인 : 당신은이 방법을 구현할 수 있습니다.

2

logger 값을 반환하지 않습니다. 이러한 모든 기능은 None을 반환하는 것으로 간주 할 수 있습니다. 데코레이터를 올바르게 정의하지 않았습니다. 그것은 더 다음과 같아야합니다

def logger(foo): 
    def _logger(foo): 
     try: 
      print foo() 
     except Exception as e: 
      print e 
    return _logger 

을 ... 그러나 이것은, 정보, 어획량의 큰 거래를 잃고 예외의 큰 거래를 삼킨 것을 명심 또한 foo 기능에서 모든 반환 값을 삼킨 그래서 훌륭하게 꾸민. 여기에 표시된 것보다 프로덕션 코드에서 뭔가 다른 것을 수행하는 것이 중요하지만 데코레이터 함수 자체가 호출 할 수있는 함수 (예 : _logger)를 리턴해야한다는 점이 중요합니다.