2012-10-08 11 views
11

के लिए पायथन फ़ंक्शन प्राप्त करना एक पायथन फ़ंक्शन में कोड ऑब्जेक्ट __code__ है।कोड ऑब्जेक्ट

sys.settrace ट्रेस frame में f_code कोड ऑब्जेक्ट है।

उन ट्रैर्स को कॉल करने के लिए जो फ़ंक्शन हैं, मैं फ़ंक्शन ऑब्जेक्ट (और इसके __annotation__ सदस्य) कैसे प्राप्त कर सकता हूं?

अब तक, परीक्षण और त्रुटि से, मेरे पास है:

if hasattr(frame.f_globals.get(frame.f_code.co_name),"__annotations__"): 

इस कार्य के लिए काम करने के लिए, लेकिन वर्ग सदस्यीय कार्यों के लिए नहीं लगता है, इससे भी बदतर, यह वर्ग-सदस्य कार्यों को उसी नाम के शीर्ष-स्तरीय कार्यों के साथ भ्रमित करता है।

(। मैं कर रहा हूँ अजगर 3.2.3 (Xubuntu) पर मैं देख रहा हूँ अजगर 3.3 inspect मॉड्यूल एक signature समारोह है, यह एक कोड वस्तु के लिए एनोटेशन वापस आ जाएगी या यह बहुत एक समारोह वस्तु की जरूरत है?)

उत्तर

5

inspect.getframeinfo मॉड्यूल के माध्यम से। मेरा मतलब है - पाइथन में ऐसा करने का कोई सीधा तरीका नहीं है - अधिकांश बार आप कोड ऑब्जेक्ट को पकड़ सकते हैं, बिना फ़ंक्शन के पहले, यह फ्रेम इंस्ट्रापक्शन के माध्यम से होता है।

इंस्पेक्ट का getframeinfo फ़ंक्शन फ्रेम चलाने के बारे में कुछ जानकारी देता है, तो आप उसका नाम प्राप्त करके फ़ंक्शन ऑब्जेक्ट पुनर्प्राप्त कर सकते हैं।

कठिन यह कार्यान्वयन निर्भर है और कुछ कमियां हैं:

>>> import inspect 
>>> def a(): 
... return inspect.currentframe() 
... 

>>> inspect.getframeinfo(a()) 
Traceback(filename='<stdin>', lineno=2, function='a', code_context=None, index=None) 
>>> b = inspect.getframeinfo(a()) 
>>> b.function 
'a' 

एक और तरीका है, लेकिन अभी भी कार्यान्वयन निर्भर, सन्दर्भदाता प्राप्त करने के लिए कोड वस्तु कहा करने के लिए जीसी मॉड्यूल (कचरा कलेक्टर) का प्रयोग है।

>>> import gc 
>>> from types import FunctionType 
>>> def a(): pass 
... 
>>> code = a.__code__ 

>>> [obj for obj in gc.get_referrers(code) if isinstance(obj, FunctionType) ][0] 
<function a at 0x7f1ef4484500> 
>>> 

- एक स्ट्रिंग के बजाय एक समारोह वस्तु प्रतीत हो रहा है अजगर 2 एक के लिए func_code

+0

'inspect.getframeinfo' टपल के' function' क्षेत्र द्वारा __code__ बदलना चाहिए - यह अजगर 3 के लिए है। और जीसी दृष्टिकोण एकाधिक संदर्भकर्ताओं को जोखिम देता है? – Will

+0

मैं gc.get_referrers (...) [0] – Will

+1

का उपयोग कर समाप्त हो गया है आप यह देखने के लिए एक चेक जोड़ सकते हैं कि func_code/__ code__ कोड वस्तु है जिसे आप सूची समझना चाहते हैं। यह अभी भी विफल रहता है यदि आप एकाधिक फ़ंक्शंस उत्पन्न करते हैं एक ही कोड ऑब्जेक्ट से भिन्न बंद, उदाहरण के लिए एक सजावट के साथ। मुझे लगता है कि प्रत्येक के लिए func_closure के cell_contents के खिलाफ f_locals की तुलना कर सकते हैं ... –

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