2012-01-13 27 views
8

Tôi muốn tạo một trang trí sẽ bắt ngoại lệ và đăng nhập đầy đủ.Kỳ lạ với một người trang trí

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

@logger 
def d(): 
    return 2/2 

if __name__ == '__main__': 
    d() 

Thats đúng tôi nghĩ, nhưng sau đó tôi chạy nó và tôi có một ngoại lệ như thế này:

1 

Traceback (most recent call last): 

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

    d() 

TypeError: 'NoneType' object is not callable 

Tại sao dịch viên nói với tôi rằng các chức năng có Không loại, nhưng gọi nó và trả lời in?

+0

Cân nhắc đọc [Wiki về trang trí] (http://wiki.python.org/moin/PythonDecorators), [PEP-0318] (http://www.python.org/dev/peps/pep-0318/) và cuối cùng [this] (http://docs.python.org/library/functools.html#functools.update_wrapper) – reclosedev

Trả lời

13

Trình trang trí của bạn cần trả về một hàm, nhưng nó không trả về bất cứ điều gì, do đó đối tượng 'TypeError:' NoneType 'không thể gọi được'. Bạn có thể triển khai theo cách này:

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

Kiểm tra This question để biết ví dụ về cách viết/sử dụng trang trí.

2

logger như bạn đã xác định, không trả lại giá trị. Tất cả các chức năng như vậy có thể được coi là trả về None. Bạn chưa xác định trang trí của mình một cách chính xác. Nó sẽ giống như thế này:

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

... nhưng hãy nhớ rằng đây mất rất nhiều thông tin, sản lượng đánh bắt và nuốt rất nhiều trường hợp ngoại lệ, và cũng có thể nuốt chửng bất kỳ giá trị trả về từ foo chức năng để trang trí. Mặc dù bạn có thể làm điều gì đó khác trong mã sản xuất của mình so với những gì bạn đã hiển thị ở đây, điều quan trọng là chức năng trang trí phải tự trả về một hàm có thể gọi (_logger trong ví dụ của tôi).

Các vấn đề liên quan