2012-01-13 20 views
8

मैं एक सजावटी बनाना चाहता हूं जो अपवादों को पकड़ लेगा और पर्याप्त रूप से लॉग इन करेगा।एक सजावट के साथ अजीबता

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

@logger 
def d(): 
    return 2/2 

if __name__ == '__main__': 
    d() 

Thats सही मुझे लगता है कि है, लेकिन फिर मैं इसे चलाने के लिए और मैं इस तरह एक अपवाद है:

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), [पीईपी -0318] (http://www.python.org/dev/peps/pep-0318/) और अंत में [यह] (http://docs.python.org/library/functools.html#functools.update_wrapper) – reclosedev

उत्तर

13

आपके सजावटी को एक फ़ंक्शन वापस करने की आवश्यकता है, लेकिन यह कुछ भी वापस नहीं कर रहा है, इसलिए 'TypeError:' noneType 'ऑब्जेक्ट कॉल करने योग्य नहीं है'।

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

बाहर This question कैसे लिखने/एक डेकोरेटर का उपयोग करने का एक अच्छा उदाहरण के लिए चेक: आप इसे इस तरह से लागू कर सकते हैं।

2

logger जैसा कि आपने परिभाषित किया है, कोई मान वापस नहीं करता है। ऐसे सभी कार्यों को None लौटने के रूप में सोचा जा सकता है। आपने अपने सजावट को सही तरीके से परिभाषित नहीं किया है। इसे और अधिक इस तरह दिखना चाहिए:

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

... लेकिन है कि यह जानकारी, कैच के एक महान सौदा खो देता है और अपवाद के एक महान सौदा निगल, यह ध्यान रखें और यह भी foo समारोह से किसी भी वापसी मान निगल तो सजा हुआ। जबकि आप यहां अपने उत्पादन कोड में कुछ अलग करते हैं, जो आपने यहां दिखाया है, महत्वपूर्ण बात यह है कि सजावटी कार्य को स्वयं एक फ़ंक्शन वापस करना होगा जिसे मेरे उदाहरण में _logger कहा जा सकता है)।

संबंधित मुद्दे