2011-12-01 12 views
5

मैं स्रोत कोड में एक पायथन फ़ंक्शन की लाइन संख्या प्राप्त करना चाहता हूं। क्या मैं क्रम में है पर निरीक्षणएक पायथन मॉड्यूल में फ़ंक्शन की लाइन संख्या (सजावट के बिना/बिना) कैसे प्राप्त करें?

inspect.getsourcelines(object)  

जो भी परिणाम में लाइन संख्या देता है मॉड्यूल, वर्ग, विधि वस्तुओं

एक नज़र था।

मुझे लगता है कि सजावटी के साथ विधियों के लिए, लाइन संख्या। वांछित फ़ंक्शन के स्रोत कोड की बजाय वास्तविक सजावटी के स्रोत कोड पर उपरोक्त फ़ंक्शन पॉइंट्स से वापस लौटे। तो इसे हल करने का कोई तरीका? (मैं समझता हूं कि दुभाषिया रनटाइम में सजावटी के अंदर लपेटने की तरह कुछ करता है, लेकिन मैं गलत हो सकता हूं)

उत्तर

4

सामान्य मामले में कोई आसान समाधान नहीं है।

एक सजावट एक ऐसा फ़ंक्शन है जो फ़ंक्शन दिया जाता है, आमतौर पर इसे एक क्लोजर में "लपेटकर" करके करता है जो ऑपरेशन करता है जिसके लिए सजावट तैयार की गई है।

फ़ाइल और लाइन नंबर की जानकारी फ़ंक्शन ऑब्जेक्ट में नहीं है और आप इस जानकारी को लपेटकर फ़ंक्शन से लपेटकर "ठीक" नहीं कर सकते हैं। उस डेटा को फ़ंक्शन के code ऑब्जेक्ट में शामिल किया गया है (.func_code के साथ उपलब्ध), और यह उन सभी बंदियों के बीच साझा किया जाता है जिन्हें आप बनाना चाहते हैं।

>>> def bar(x): 
...  def foo(): 
...   return x 
...  return foo 
... 
>>> f1 = bar(1) 
>>> f2 = bar(2) 
>>> f1() 
1 
>>> f2() 
2 
>>> f1.func_code is f2.func_code 
True 
>>> 
+0

मैं देखता हूं, स्पष्टीकरण के लिए धन्यवाद। 'Func_code' के साथ भी लाइन नंबर प्राप्त हो रहा है। सजावटी स्रोत कोड के। मैं सेटिंग लाइन नंबर को अनदेखा करने के साथ आगे बढ़ूंगा। किसी भी सजावट के साथ तरीकों के लिए। मेरा सवाल यह है कि किसी विधि को खोजने के लिए कैसे है _any_ सजावटी या नहीं (सजावटी का नाम पहले ज्ञात नहीं है) – Hari

+0

@ हरि: एक सजावटी जो कुछ भी चाहता है उसे वापस कर सकता है (यहां तक ​​कि ऐसा कुछ जो बंद नहीं है या यहां तक ​​कि वही कार्य है इनपुट पर आ गया, संभवतः इसे वापस करने से पहले कुछ अन्य गणना कर रहा है) इसलिए कोई फंक्शन सजाया गया है या फ़ंक्शन ऑब्जेक्ट नहीं दिया गया है, यह जानने के लिए कोई 100% निश्चित विधि नहीं है। – 6502

1

wrapt मॉड्यूल आपको सज्जाकार जो एक समारोह का स्रोत खोजने के लिए आवश्यक मेटाडाटा को बनाए रखने के साथ ही अन्य आत्मनिरीक्षण प्रदर्शन लिखने के लिए अनुमति देकर इस समस्या का हल। यह एक बेहतर functools.wraps की तरह है।

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