如何从函数中获取函数的名称(或者对函数的“自我”引用)?

时间:2011-04-26 07:32:22

标签: python

This answer表示函数的内置__name__属性可以在外部函数中使用,即print f.__name__。但是,如何从 函数本身获取此属性?

仅使用不合格的__name__无效:print __name__打印__main__

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

或者,是否有一种函数的self对象,即我可以获得指向以常见方式执行的函数的指针吗?

我不喜欢this question中提出的方法 - 它觉得为这么简单的任务乱砍堆栈不是正确的方法。

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

Python版本是2.6.4 BTW

2 个答案:

答案 0 :(得分:4)

如果您不想“检查”堆栈,可以使用方法上的装饰器将其存储在您的词典中,并避免再次启动它。

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

其中“function_list”是已调用的函数列表(我不知道你如何管理你的字典)

答案 1 :(得分:3)

也许你应该使用onlyonce装饰器装饰你正在调用的每个函数?那将是更加pythonic。概念证明如下。

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

此外,函数是“不可变的”,可以存储为字典键。您不必依赖名称。根据您的使用情况,这可能是一个优势(或缺点)。