मैं एक सजावटी लिख रहा हूं, और विभिन्न कष्टप्रद कारणों से [0] यह जांचने के लिए उपयुक्त होगा कि यह फ़ंक्शन लपेटने वाला कार्य स्टैंड-अलोन या कक्षा के हिस्से के रूप में परिभाषित किया जा रहा है (और आगे कौन सी कक्षाएं जो नई कक्षा है उपवर्गीकरण)।पायथन: क्या एक सजावटी निर्धारित कर सकता है कि कक्षा में एक फ़ंक्शन परिभाषित किया जा रहा है या नहीं?
उदाहरण के लिए:
def my_decorator(f):
defined_in_class = ??
print "%r: %s" %(f, defined_in_class)
@my_decorator
def foo(): pass
class Bar(object):
@my_decorator
def bar(self): pass
प्रिंट चाहिए:
<function foo …>: False
<function bar …>: True
इसके अलावा, कृपया ध्यान दें:
- बिंदु सज्जाकार समारोह लागू होते हैं पर अभी भी एक समारोह हो जाएगा, नहीं एक अनबाउंड विधि, इसलिए उदाहरण/अनबाउंड विधि के लिए परीक्षण (
typeof
याinspect
का उपयोग करके) नहीं होगा टी काम नहीं - कृपया केवल सुझाव है कि हल इस समस्या प्रदान करते हैं - मुझे पता है इसी तरह के कई तरीके यह अंत पूरा करने के लिए (पूर्व, एक वर्ग डेकोरेटर का प्रयोग करके) हैं कि हूँ, लेकिन मैं उन पर सजावट समय होने के लिए चाहते हैं, बाद में नहीं।
[0]: विशेष रूप से, मैं एक सजावट लिख रहा हूं जो nose
के साथ पैरामीटर परीक्षण करना आसान बना देगा। हालांकि, nose
unittest.TestCase
के उप-वर्गों पर परीक्षण जनरेटर चलाने के लिए नहीं होगा, इसलिए मैं अपने सजावटी को यह निर्धारित करने में सक्षम होना चाहूंगा कि इसका उपयोग TestCase
के उप-वर्ग के अंदर किया जा रहा है और उचित त्रुटि के साथ विफल हो गया है। स्पष्ट समाधान - लिपटे समारोह कॉल करने से पहले isinstance(self, TestCase)
का उपयोग कर काम नहीं करता, क्योंकि लिपटे समारोह जरूरत एक जनरेटर है, जो सभी पर निष्पादित नहीं हो सकता है।
उत्सुकता के लिए, यहां परिणाम है: http://paste.pocoo.org/show/532430/ –