在Python 2.7中获取调用方的函数对象?
在玩在Python 2.7中获取调用方的函数对象?,python,python-2.7,callstack,Python,Python 2.7,Callstack,在玩inspect并阅读此处的其他问题时,我仍然无法理解如何更清晰地获取调用方的函数对象,而不是按照其路径加载模块,然后在其中查找函数 换句话说,您将如何完成以下操作,以便caller()返回一个方法对象 import inspect def caller(): frame = inspect.stack()[2] code = frame[0] path = frame[1] line = frame[2] name = frame[3] # fun
inspect
并阅读此处的其他问题时,我仍然无法理解如何更清晰地获取调用方的函数对象,而不是按照其路径加载模块,然后在其中查找函数
换句话说,您将如何完成以下操作,以便caller()
返回一个方法对象
import inspect
def caller():
frame = inspect.stack()[2]
code = frame[0]
path = frame[1]
line = frame[2]
name = frame[3] # function NAME string
# TODO: now what?
return func
def cry_wolf():
func = caller()
print "%s cried 'WOLF!'" % (func.__name__,)
def peter():
cry_wolf()
记住,我已经知道函数名,但我试图访问的是调用代码运行的函数对象。期望的结果是:
peter cried 'WOLF!'
完成了!感谢用户61612,我完成了以下代码:
import imp, inspect, sys
def caller():
frame = inspect.stack()[2]
code = frame[0]
path = frame[1]
line = frame[2]
name = frame[3]
return code.f_globals[name]
def cry_wolf():
func = caller()
print "%s cried 'WOLF!'" % (func.__name__,)
def peter():
cry_wolf()
太棒了 帧对象具有以下特性:
导入检查
def caller():
tup=inspect.stack()[2]
返回tup[0].f_globals[tup[3]]
狼叫了一声:
func=调用方()
打印(“%s喊‘狼’!”%(func.\u name\uuuuuuuuuuuuuuuuuuuuuuuuuuuuu,)35;彼得喊‘狼’
彼得():
狼来了
这太棒了,只是因为我输入的堆栈帧不是[2]
,而是[1]
,所以您最终使用了错误的帧。我把你的代码改编成我的解决方案,我把它放在问题里。谢谢大家!@是的,我不确定这是不是正确的框架:)@NeilC.Obremski不管怎样,我更新了答案以澄清问题
import inspect
def caller():
tup = inspect.stack()[2]
return tup[0].f_globals[tup[3]] # <function peter at address>
def cry_wolf():
func = caller()
print("%s cried 'WOLF!'" % (func.__name__,)) # peter cried 'WOLF!'
def peter():
cry_wolf()