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