निम्नलिखित कार्य करें:

def alpha(a):
    return a**2

def beta(a):
    return alpha(a)+1

beta फ़ंक्शन का सोर्स कोड देखने के लिए हम यह कर सकते हैं:

import inspect
inspect.getsource(beta)

प्रश्न:

मैं beta, alpha के स्रोत कोड और beta से बुलाए जा रहे सभी कार्यों को कैसे देख सकता हूं यदि मुझे केवल यह पता है कि मेरे फ़ंक्शन का नाम beta है?

0
Sandu Ursu 21 अप्रैल 2020, 21:37

2 जवाब

तो... अपनी प्रारंभिक पोस्ट पर वापस जाएं और कार्यों को सीधे दुभाषिया में डालें। फिर:

for a in beta.__globals__:
   if callable(beta.__globals__[a]):
      print(a)

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

1
Fubar 21 अप्रैल 2020, 22:51
मैं इसे अपने JupyterLab / नोटबुक के भीतर से करने में सक्षम होना चाहूंगा जहां मैं अन्य कार्य भी करता हूं?
 – 
Sandu Ursu
21 अप्रैल 2020, 22:57
किसी भी अजगर विधि के लिए वैश्विक होना चाहिए। निरीक्षण का उपयोग करके आप if को "ifspec.isfunction(beta.__globals__[a]):" में बदल सकते हैं और यह वही काम करेगा लेकिन केवल अल्फा और बीटा फ़ंक्शन प्रिंट करेगा। तो यह कुछ ऐसा होगा जैसे "रूटीन में func के लिए।__globals__: if निरीक्षण.isfunction(routine.__globals__[func]): प्रिंट (func)" और जब तक आपके पास एक ज्ञात फ़ंक्शन है, तब तक आप इसके सभी ज्ञात कार्यों पर पुनरावृति कर सकते हैं और उनके ज्ञात कार्य, आदि खोजे गए नियमित नाम के साथ एक ही लूप का प्रदर्शन करके।
 – 
Fubar
21 अप्रैल 2020, 23:06

दो मॉड्यूल को एक .py फ़ाइल में सहेजें (उदाहरण के तौर पर test.py चुनें)। अब एक इंटरैक्टिव पायथन सत्र खोलें और:

python3
Python 3.6.9 (default, Sep 11 2019, 16:40:19)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-16)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import test
>>> import inspect
>>> print (inspect.getsource(test.beta))
def beta(a):
    return alpha(a)+1

>>> print (inspect.getsource(test.alpha))
def alpha(a):
    return a**2

यदि आप अजगर शुरू करते हैं तो यह काम नहीं करेगा, फिर कार्यों में टाइप करें क्योंकि निरीक्षण के लिए स्रोत कोड होना चाहिए जहां से फ़ंक्शन आए थे। स्रोत के बिना उपलब्ध आइटम पहले से ही बाइटकोड में संकलित हैं, इसलिए आपको कुछ भी पठनीय प्रदान नहीं करेगा।

0
Fubar 21 अप्रैल 2020, 22:11
आप नहीं जानते कि alpha नाम का एक ऐसा फंक्शन है। केवल beta को देखकर आप देख सकते हैं कि एक और फ़ंक्शन है जिसे कहा जा रहा है (और भी हो सकता है), इस मामले में alpha और आपको alpha का स्रोत कोड भी आउटपुट करना चाहिए .
 – 
Sandu Ursu
21 अप्रैल 2020, 22:17
अच्छा... आप कुछ इस तरह कर सकते हैं: बीटा में नाम के लिए.__ग्लोबल्स__: प्रिंट (नाम, बीटा.__ग्लोबल्स__[नाम]) और सूचीबद्ध कार्यों को देखें। यदि आप इसे उपरोक्त फ़ाइल से आयात करते हैं तो यह "test.beta" होगा।
 – 
Fubar
21 अप्रैल 2020, 22:31
मुझे NameError: name 'name' is not defined मिलता है,
 – 
Sandu Ursu
21 अप्रैल 2020, 22:39