我想大约在python特定函数的调用者的信息。 例如:
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."
是否有可能与蟒蛇?
是的, sys._getframe()
功能使用户可以检索当前执行堆栈,然后你就可以用中发现的方法和文件检查帧inspect
模块 ; 你会寻找特定的当地人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__)
请注意,您需要采取一些护理检测到您在每帧中找到什么样的信息。
sys._getframe()
返回一个框对象,就可以通过整个堆叠链通过跟随f_back
上的每个参考。 或者你也可以使用inspect.stack()
函数来产生帧列表和其他信息。
一个例子:
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
而如果不是来自另一个叫你(在IDLE):
>>> f1(1)
I am f1 and was called by <module>
由于乔恩克莱门特回答我是能够使返回所有呼叫者的有序列表的功能:
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)