2012-06-28 7 views
5

कम होने के लिए, मैं एक स्ट्रिंग 'next',एक पायथन विधि के स्रोत कोड कैसे जांचें?

next = "123rpq" 

है लगता है और मैं 'next' करने के लिए एक str विधि .isdigit() आवेदन कर सकते हैं। तो मेरा सवाल यह है कि इस विधि के कार्यान्वयन की जांच कैसे करें। इसलिए 'विधि' का स्रोत कोड प्राप्त करने के लिए inspect.getsource(somefunction) जैसी कोई चीज़ है?

अद्यतन: नीचे नाम 'next' के बारे में टिप्पणी देखें।

+2

कृपया अपने चर 'अगली' को कॉल न करें क्योंकि यह बिल्टिन 'अगली' छाया करता है। – Matthias

+0

@ माथियास, धन्यवाद। –

उत्तर

7
मॉड्यूल, कक्षाएं, कार्य करता है और कुछ अन्य वस्तुओं आप inspect.getfile या inspect.getsourcefile उपयोग कर सकते हैं

। हालांकि, निर्मित वस्तुओं और विधियों के लिए इसका परिणाम TypeError होगा। C0deH4cker द्वारा metioned के रूप में, अंतर्निहित वस्तुओं और विधियों सी में लागू कर रहे हैं, तो आपको सी स्रोत कोड ब्राउज़ करना होगा। isdigit बिल्टिन स्ट्रिंग ऑब्जेक्ट का एक तरीका है, जिसे पाइथन स्रोत कोड की Objects निर्देशिका में stringobject.c फ़ाइल में कार्यान्वित किया गया है। यह isdigits विधि इस फ़ाइल के लाइन 33 9 2 से लागू की गई है। एक ही लेकिन अधिक सामान्य प्रश्न के लिए मेरा उत्तर here भी देखें।

0

आप उस विशेष विधि पर दस्तावेज़ के लिए method.__doc__ प्रिंट करने का प्रयास कर सकते हैं। यदि आप केवल उत्सुक हैं, तो आप यह देखने के लिए अपने PYTHONPATH को देख सकते हैं कि आपके मॉड्यूल कहां से आयात किए जाते हैं, और देखें कि क्या आपको उस मॉड्यूल से .py फ़ाइल मिली है

+1

'मदद (str.isdigit) ' –

+0

@ पाब्लो, धन्यवाद का उपयोग करना बेहतर है। क्या आप मुझे मेरे प्रश्न में मामले का उपयोग कर उदाहरण दे सकते हैं; 'next.isdigit()' के लिए स्रोत कोड कैसे मुद्रित करें? –

+0

@ अश्विनी चौधरी ने कहा, आप मदद लिख सकते हैं (str.isdigit) या str.isdigit .__ doc__ –

6

isdigit() जिस विधि के बारे में आप बात कर रहे हैं वह एक अंतर्निहित अंतर्निहित विधि है डाटा प्रकार। मतलब, इस विधि का स्रोत सी में लिखा गया है, पायथन नहीं। यदि आप वास्तव में इसका स्रोत कोड देखना चाहते हैं, तो मेरा सुझाव है कि आप http://python.org पर जाएं और पायथन के स्रोत कोड डाउनलोड करें।

0

जबकि मैं आम तौर पर सहमत हूं कि inspect एक अच्छा जवाब है, यह आपकी कक्षा (और इस प्रकार कक्षा विधि) को दुभाषिया में परिभाषित किया गया था जब यह फ्लैट हो जाता है।

आप dill से dill.source.getsource उपयोग करते हैं, आप कार्यों और lambdas के स्रोत प्राप्त कर सकते हैं, भले ही वे सहभागी परिभाषित कर रहे हैं। यह सीमाओं में परिभाषित बाध्य या अनबाउंड क्लास विधियों और कार्यों से भी कोड प्राप्त कर सकता है ... हालांकि, हो सकता है कि आप उस कोड को संलग्न ऑब्जेक्ट के कोड के बिना संकलित करने में सक्षम न हों।

>>> from dill.source import getsource 
>>> 
>>> def add(x,y): 
... return x+y 
... 
>>> squared = lambda x:x**2 
>>> 
>>> print getsource(add) 
def add(x,y): 
    return x+y 

>>> print getsource(squared) 
squared = lambda x:x**2 

>>> 
>>> class Foo(object): 
... def bar(self, x): 
...  return x*x+x 
... 
>>> f = Foo() 
>>> 
>>> print getsource(f.bar) 
def bar(self, x): 
    return x*x+x 

>>> 

builtin कार्य या विधियों के लिए, dill.source काम नहीं करेगा ... लेकिन ...

तुम अब भी रूप में सुझाव दिया है कि यह (में स्रोत कोड के साथ फ़ाइल खोलने के लिए अपने पसंदीदा संपादक का उपयोग कर का सहारा लेना नहीं हो सकता है अन्य उत्तरों)। cinspect नामक एक नया पैकेज है जो builtins के लिए स्रोत देखने में सक्षम होने के लिए purports।