首页 文章

从别名函数中确定函数名称

提问于
浏览
1

如何确定是使用函数名称还是使用该函数别名的名称调用函数?

我可以通过执行以下操作来检查函数以从函数体内获取其名称:

import inspect

def foo():
   print(inspect.stack()[0][3])

foo() # prints 'foo'

来源:Determine function name from within that function (without using traceback)

但是,如果我将该函数作为别名并尝试相同的东西,我会获得原始函数名称(而不是别名)

bar = foo
bar() # prints 'foo'

我希望能够做到以下几点:

def foo():
    print(... some code goes here ...)

bar = foo

foo() # prints 'foo'
bar() # prints 'bar'

2 回答

  • 1

    我有一个(有些hacky)解决方案依赖于正则表达式来解析字符串中的函数名称 . 可能有一个更清洁的解决方案,但至少只使用检查这是我能找到的最好的解决方案 .

    import inspect
    import re
    
    
    function_from_call = re.compile("\w+(?=\(\))")
    
    
    def foo():
        _, call_frame, *_ = inspect.stack()
        _, _, _, _, call, *_ = call_frame
        print(re.search(function_from_call, str(call)).group())
    
    bar = foo
    bar()  # prints bar
    foo()  # prints foo
    

    简短说明:首先,我 grab 导致调用此函数的调用的检查框架 . 然后,我从这个帧中提取实际的调用字符串,并将一个正则表达式应用于此调用字符串,该字符串仅为我们提供函数名称 .

    注意:从解释器shell中,inspect的行为有所不同,上面的代码会产生错误,因为我的正则表达式与实际的函数名不匹配 . @ user2357112对此问题的评论中指出了另一个警告:调用与名称直接关联并不明显,如

    l = [foo]; l[0]()
    

    从脚本运行时,我的解决方案将正确处理简单的重命名案例(如本问题中给出的那样),但我不提倡使用它,因为如上所述的极端情况将导致混淆错误 .

  • 1

    基于我对您的问题范围的有限知识,这适用:

    import inspect
    
    def foo():
      print(inspect.stack()[1][4][0].strip())
    
    foo()
    bar = foo
    bar()
    

    结果:

    foo()
    bar()
    

相关问题