感谢 Jon Clements 的回答,我能够创建一个返回所有调用者的有序列表的函数:
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)