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“太黑”很幽默。在多维堆栈中导航的语法可能保证了阅读文档的正确性,但它是有效的。下面是另一个可能很有趣的黑客方法:将函数作为参数传递给自身。