如何在不直接命名的情况下从其内部访问功能

时间:2018-08-16 08:50:32

标签: python

我想知道如何在不直接命名的情况下从其中访问功能。

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

在这种情况下,它将无法按预期工作。

1 个答案:

答案 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中不能不检查堆栈跟踪就不能这样做。