2012-08-03 27 views
7

में फ़ंक्शन कॉलर्स की जानकारी प्राप्त करें मैं पाइथन में किसी विशिष्ट फ़ंक्शन के कॉलर्स के बारे में जानकारी प्राप्त करना चाहता हूं। उदाहरण के लिए:पायथन

class SomeClass(): 
    def __init__(self, x): 
     self.x = x 
    def caller(self): 
     return special_func(self.x) 

def special_func(x): 
    print "My caller is the 'caller' function in an 'SomeClass' class." 

क्या यह पाइथन के साथ संभव है?

उत्तर

10

हां, sys._getframe() फ़ंक्शन आपको वर्तमान निष्पादन स्टैक से फ़्रेम पुनर्प्राप्त करने देता है, जिसे आप inspect module में पाए गए तरीकों और दस्तावेजों का निरीक्षण कर सकते हैं; आप, f_locals विशेषता में विशिष्ट स्थानीय लोगों की तलाश में हो जाएगा और साथ ही f_code जानकारी के लिए:

import sys 
def special_func(x): 
    callingframe = sys._getframe(1) 
    print 'My caller is the %r function in a %r class' % (
     callingframe.f_code.co_name, 
     callingframe.f_locals['self'].__class__.__name__) 

ध्यान दें कि आप किस तरह की जानकारी आप प्रत्येक फ्रेम में मिल पता लगाने के लिए कुछ देखभाल करने के लिए की आवश्यकता होगी।

+2

डॉक्स से: 'यह Python.' – pradyunsg

3

एक उदाहरण:

def f1(a): 
    import inspect 
    print 'I am f1 and was called by', inspect.currentframe().f_back.f_code.co_name 
    return a 

def f2(a): 
    return f1(a) 

"तुरंत" फोन करने वाले को पुनः प्राप्त करेंगे।

>>> f2(1) 
I am f1 and was called by f2 

और अगर दूसरे से आमंत्रित नहीं किया गया आप (निष्क्रिय) में मिलती है:

>>> f1(1) 
I am f1 and was called by <module> 
+0

के सभी कार्यान्वयन में मौजूद धन्यवाद इसकी गारंटी नहीं है, मैं इसे लेने और इसे अपनी जरूरतों के अनुरूप अनुकूलित करने में सक्षम था। –

2

धन्यवाद जॉन क्लेमेंट्स जवाब देने के लिए मैं एक समारोह है कि सभी कॉलर्स के एक आदेश दिया सूची लौटाती है बनाने के लिए कर रहा था:

def f1(): 
    names = [] 
    frame = inspect.currentframe() 
    ## Keep moving to next outer frame 
    while True: 
     try: 
      frame = frame.f_back 
      name = frame.f_code.co_name 
      names.append(name) 
     except: 
      break 
    return names 

और जब एक श्रृंखला में कहा जाता है:

def f2(): 
    return f1() 

def f3(): 
    return f2() 

def f4(): 
    return f3() 

print f4() 

इस तरह दिखता है:

['f2', 'f3', 'f4', '<module>'] 

मेरे मामले में मैं '<module>' पर और बाद कुछ को फ़िल्टर, और फिर अंतिम आइटम ले उद्भव फोन करने वाले का नाम हो।

या '<' के साथ शुरू किसी भी नाम की पहली उपस्थिति पर जमानत मूल पाश को संशोधित:

frame = frame.f_back 
name = frame.f_code.co_name 
if name[0] == '<': 
    break 
names.append(name)