从别名函数中确定函数名

2024-03-28 01:25:02 发布

您现在位置:Python中文网/ 问答频道 /正文

如何确定函数是使用函数名调用的,还是通过该函数的别名调用的?你知道吗

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

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'

Tags: 函数nameimport名称foostackdef来源
2条回答

基于我对你的问题范围的有限了解,这是可行的:

import inspect

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

foo()
bar = foo
bar()

结果:

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

简要说明:首先,我抓取调用的inspect框架,该框架导致对该函数的调用。然后,我从这个框架中提取实际的调用字符串,并对这个调用字符串应用regex,它只给出函数名。你知道吗

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

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

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

相关问题 更多 >