Python 如何获得函数';函数中的名称(或函数的“自我”引用类型)?
显示函数有一个内置的Python 如何获得函数';函数中的名称(或函数的“自我”引用类型)?,python,Python,显示函数有一个内置的\uuuuu name\uuuuu属性,可从该函数的外部使用,即打印f.\uuuu name\uuuu。但是,如何从函数本身的中获取该属性 仅仅使用非限定的\uuuuuu name\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu 使用打印f.\uuu name\uuuu从f()内部打印看起来很愚蠢-我也可以键入“f” 或者,是否存在一种
\uuuuu name\uuuuu
属性,可从该函数的外部使用,即打印f.\uuuu name\uuuu
。但是,如何从函数本身的中获取该属性
仅仅使用非限定的\uuuuuu name\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
使用打印f.\uuu name\uuuu
从f()
内部打印看起来很愚蠢-我也可以键入“f”
或者,是否存在一种函数的self
对象,即我是否可以获取指向以常用方式执行的函数的指针
我不喜欢中提出的方法-它觉得为这样简单的任务破解堆栈不是正确的方法
动机:我有一个{keyword:function}
字典,从输入中读取关键字并执行适当的函数。我希望每个函数只执行一次,所以我希望每个函数在执行时在某些数据结构中注册自己。我知道我可以在字典里自己做,但是我想用一个单独的数据结构来做这个
Python版本是2.6.4 BTW如果您不想“检查”堆栈,可以在方法上使用装饰程序将其存储在字典中,并避免两次启动它
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\u list”是已经调用的函数列表(我不知道你是如何管理你的字典的)也许你应该用onlynce
装饰器来装饰你调用的每个函数?那会更像蟒蛇。下面是概念证明
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()
此外,函数是“不可变的”,可以存储为字典键。你不必依赖这些名字。这可能是一个优势(或劣势),取决于您的使用。谢谢,易卜拉欣。你的最后一段的意思是我可以做[f]=True吗?是的,但我使用集合而不是字典,因为你没有任何“值”使用键存储。但这并没有回答标题中的问题。它回答了本应提出的问题,而这通常更有用。现在,由于您的回答,我了解了装饰器:),您的解决方案在定义和装饰函数时,不是只检查一次函数列表
?每次执行函数时,检查不应该是动态的吗?哦,是的,你说得对;)要在调用时执行此操作,您必须将测试移动到修饰的方法中,只需链接到此答案,即可解决标题中的问题:谢谢@fossilet,但正如我在问题中所说的那样,使用调用堆栈来实现此感觉。。。我觉得你觉得inspect“太黑”很幽默。在多维堆栈中导航的语法可能保证了阅读文档的正确性,但它是有效的。下面是另一个可能很有趣的黑客方法:将函数作为参数传递给自身。