我想知道如何在不直接命名的情况下从其中访问功能。
def fact(n):
this = # some code, where we don't use the name "fact"
print(fact == this) # True
if n < 1:
return 1
return n * this(n-1)
上面的代码的行为应与以下内容完全相同:
def fact(n):
if n < 1:
return 1
return n * fact(n-1)
有人有什么想法吗?
编辑:
我的问题与Determine function name from within that function (without using traceback)不同。我需要以上代码中的fact == this
才能返回True
。
EDIT2:
@ksbg的答案很好,但是请考虑以下代码:
from inspect import stack, currentframe
def a():
def a():
f_name = stack()[0][3] # Look up the function name as a string
this = currentframe().f_back.f_globals[f_name]
print(a == this)
a()
a() # False
在这种情况下,它将无法按预期工作。
答案 0 :(得分:4)
这可以通过检查堆栈跟踪来完成。首先,我们以字符串形式查找函数名称,然后返回一帧(或一级),并从模块的全局变量中获取函数:
from inspect import stack, currentframe
f_name = stack()[0][3] # Look up the function name as a string
this = currentframe().f_back.f_globals[f_name] # Go back one level (to enter module level) and load the function from the globals
但是,我不认为这是一种好的做法,如果可能的话,我会避免这样做。正如您对问题的评论中已经指出的那样,在Python中不能不检查堆栈跟踪就不能这样做。