के रूप में उल्लेख किया कई बार देख रहे थे समारोह नाम का उपयोग कर रहा है। यह केवल परिभाषा के मॉड्यूल में और केवल वैश्विक कार्य के लिए काम करता है।
def foo():
""" this is foo """
doc = foo.__doc__
class Foo:
def bar(self):
""" this is bar """
doc = Foo.bar.__doc__
के बराबर है: के रूप में इन नामों को काफी लंबे समय से प्राप्त कर सकते हैं जो काफी बोझिल है - आप एक सदस्य समारोह के डॉक स्ट्रिंग पता लगाना चाहते हैं, तो आप भी वर्ग के नाम से पथ देखने के लिए की आवश्यकता होगी
def foo():
""" this is foo """
doc = globals()["foo"].__doc__
class Foo:
def bar(self):
""" this is bar """
doc = globals()["Foo"].bar.__doc__
आप कॉलर के डॉक स्ट्रिंग को देखने के लिए चाहते हैं, कि वैसे भी काम नहीं करेगा के रूप में अपने प्रिंट-हेल्पर एक पूरी तरह से अलग वैश्विक() शब्दकोश के साथ एक पूरी तरह से अलग मॉड्यूल में रहते हैं हो सकता है। स्टैक फ्रेम को देखने का एकमात्र सही विकल्प है - लेकिन पायथन आपको फ़ंक्शन ऑब्जेक्ट निष्पादित नहीं करता है, यह केवल "f_code" कोड ऑब्जेक्ट का संदर्भ है। लेकिन चलते रहें, क्योंकि उस समारोह के "f_globals" का भी संदर्भ है। तो आप कॉलर के दस्तावेज़ को इस तरह प्राप्त करने के लिए एक फ़ंक्शन लिख सकते हैं, और इससे भिन्नता के रूप में, आपको अपनी खुद की दस्तावेज़ स्ट्रिंग मिलती है।
import inspect
def get_caller_doc():
frame = inspect.currentframe().f_back.f_back
for objref in frame.f_globals.values():
if inspect.isfunction(objref):
if objref.func_code == frame.f_code:
return objref.__doc__
elif inspect.isclass(objref):
for name, member in inspect.getmembers(objref):
if inspect.ismethod(member):
if member.im_func.func_code == frame.f_code:
return member.__doc__
और यह परीक्षण करने के लिए चलते हैं: इस उत्पादन
this is foo
this is bar
None
None
showing my doc
वास्तव में, ज्यादातर लोगों को अपने स्वयं के दस्तावेज़ स्ट्रिंग केवल यह हाथ नीचे एक तर्क के रूप चाहते हैं, उसमें
def print_doc():
print get_caller_doc()
def foo():
""" this is foo """
print_doc()
class Foo:
def bar(self):
""" this is bar """
print_doc()
def nothing():
print_doc()
class Nothing:
def nothing(self):
print_doc()
foo()
Foo().bar()
nothing()
Nothing().nothing()
# and my doc
def get_my_doc():
return get_caller_doc()
def print_my_doc():
""" showing my doc """
print get_my_doc()
print_my_doc()
परिणाम, लेकिन कहा जाने वाला सहायक कार्य इसे अपने आप देख सकता है। मैं इसे अपने अनजान कोड में उपयोग कर रहा हूं जहां कभी-कभी कुछ लॉग भरने या परीक्षण डेटा के रूप में दस्तावेज़ स्ट्रिंग का उपयोग करने के लिए यह आसान होता है। यही कारण है कि प्रस्तुत get_caller_doc() केवल टेस्ट क्लास के वैश्विक परीक्षण कार्यों और सदस्य कार्यों की तलाश करता है, लेकिन मुझे लगता है कि अधिकांश लोगों के लिए पर्याप्त है जो दस्तावेज़ स्ट्रिंग के बारे में जानना चाहते हैं।
class FooTest(TestCase):
def get_caller_doc(self):
# as seen above
def test_extra_stuff(self):
""" testing extra stuff """
self.createProject("A")
def createProject(self, name):
description = self.get_caller_doc()
self.server.createProject(name, description)
sys._getframe साथ एक उचित get_frame_doc (फ्रेम) को परिभाषित करने के लिए (1) पाठक के लिए छोड़ दिया जाता है()।
मुझे वास्तव में आपकी सजावट विधि पसंद है। फ्रेम निरीक्षण से अधिक पाइथोनिक और कम जोखिम भरा, और आपको फ़ंक्शन नाम का उपयोग करने से बचने की अनुमति देता है। Slick! Upvoted! – FlipMcF
धन्यवाद, इसकी सराहना करें। :-) – kindall
अंतिम कोड स्निपेट में my_func की तर्क सूची में * args और ** kwargs नहीं होना चाहिए? या अतिरिक्त तर्क केवल छोड़े गए थे, हालांकि प्रोग्रामर फ़ंक्शन परिभाषा में वांछित अतिरिक्त तर्क डाल सकता था। मुझे यकीन नहीं है कि यह स्पष्ट है, हालांकि यह पाठ में "इसके पहले तर्क के रूप में" कहता है। – RufusVS