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

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

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

import inspect

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

foo() # prints 'foo'

源:确定该函数内的函数名称(不使用追溯)

但是,如果我别名该函数并尝试相同的事情,我会得到原始函数名称(而不是别名)

bar = foo
bar() # prints 'foo'

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

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

bar = foo

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

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

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

简单的解释:首先,我抓住导致调用此函数的调用的检查框架。 然后,我从这个框架中提取实际的调用字符串,并将正则表达式应用于此调用字符串,该字符串只给出函数名称。

注意:从解释器外壳,检查行为不同,上面的代码产生一个错误,因为我的正则表达式不能匹配一个实际的函数名称。 @ user2357112在对这个问题的评论中指出了一个额外的警告:一个调用直接绑定到一个名字并不明显,如

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

从脚本运行时,我的解决方案将正确处理简单的重命名案例(如本问题中给出的那样),但我并不主张使用它,因为上面的案例会导致混淆错误。


根据我对您的问题范围所掌握的有限知识,这是有效的:

import inspect

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

foo()
bar = foo
bar()

结果:

foo()
bar()
链接地址: http://www.djcxy.com/p/55189.html

上一篇: Determine function name from within an aliased function

下一篇: How can I elide a function wrapper from the traceback in Python