关于python:如何从函数内部获取函数名(或某种对函数的”self”引用)?

how to get function's name from within the function (or kind of “self” reference to the function)?

这个答案表明,函数有一个内置的__name__属性,可以从函数外部使用,即print f.__name__属性。但是,如何从函数本身中获取该属性?

仅仅使用不合格的__name__并没有帮助:print __name__打印__main__

f()内部使用print f.__name__看起来很愚蠢-我也可以输入"f"

或者,函数是否有一种self对象,也就是说,我可以得到一个指向以普通方式执行的函数的指针吗?

我不喜欢这个问题中提出的方法——它认为为这么简单的任务对堆栈进行黑客攻击是不合适的方法。

动机:我有一本{keyword:function}的字典,从输入中读取关键字,并执行适当的函数。我希望每个函数只执行一次,所以我希望每个函数在执行时在某些数据结构中注册自己。我知道我可以在字典中自己完成,但我想为此使用一个单独的数据结构。

python版本为2.6.4 btw


如果不想"检查"堆栈,可以在方法上使用decorator将其存储在字典中,并避免启动两次。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
function_list = []
def method_singleton(function):
    global function_list
    def decorated_method(*args, **kwargs):
        if function.__name__ not in function_list:
            function_list.append(function.__name__)
            return function(*args, **kwargs)
        else:
            print"Method %s already called"%function.__name__
    return decorated_method

@method_singleton
def method_to_decorate(arg1, arg2):
    pass

其中"函数列表"是已经调用的函数列表(我不知道如何管理您的词典)


也许您应该用一个onlyonce修饰器来修饰您所调用的每个函数?那就更像是Python了。概念证明如下。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
called = set()

def onlyonce(fn):
    def decorated(*largs, **kargs):
        if fn not in called:
            called.add(fn)
            print"Calling"
            fn(*largs, **kargs)
        else:
            print"Already called"
    return decorated



@onlyonce
def test_function():
    print"I am getting called now"


test_function()
test_function()
test_function()
test_function()

此外,函数是"不变的",可以存储为字典键。你不必依赖这些名字。这可能是一个优势(或劣势),取决于您的使用。