【问题标题】:Get function object of caller in Python 2.7?在 Python 2.7 中获取调用者的函数对象?
【发布时间】:2015-05-03 05:59:20
【问题描述】:

在玩inspect 并在这里阅读其他问题时,我仍然无法弄清楚如何更干净地获取调用者的函数object,而不是通过其路径加载模块然后找到里面的功能。

换句话说,您将如何完成以下操作以使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()

太棒了!

【问题讨论】:

    标签: python python-2.7 callstack


    【解决方案1】:

    框架对象具有f_globals attribute:

    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()
    

    【讨论】:

    • 这很好,只是因为我的堆栈帧错字[1] 而不是[2],你最终得到了错误的帧。我将您的代码改编为我提出的问题的解决方案。谢谢!
    • @NeilC.Obremski 是的,我不确定这是否是正确的框架:)
    • @NeilC.Obremski 无论如何,我更新了答案以使其清楚
    猜你喜欢
    • 2012-08-01
    • 2020-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多