Python中的函数是对象,碰巧这些对象有一个属性,其中包含定义它们的名称:>>> def x():
... pass
...
>>> print x.__name__
x
所以,一个天真的方法可能是:
^{pr2}$
这似乎很管用。但是,由于您必须知道函数中x的名称,所以您并没有真正获得任何东西;您可能只需要这样做:def x():
print "x"
但事实上,这比这更糟糕,因为__name__属性只引用函数在定义时使用的名称。如果它绑定到另一个名称,它的行为将不符合您的预期:>>> y = x
>>> y()
x
更糟糕的是,如果原来的名字已经不在了,它就根本不起作用了:>>> del x
>>> y()
Traceback (most recent call last):
File "", line 1, in
File "", line 2, in x
NameError: global name 'x' is not defined
第二个问题是一个你实际上可以解决的问题,尽管它并不漂亮。诀窍是编写一个decorator,它可以将函数的名称作为参数传递给它:>>> from functools import wraps
>>> def introspective(func):
... __name__ = func.__name__
... @wraps(func)
... def wrapper(*args, **kwargs):
... return func(__name__=__name__, *args, **kwargs)
... return wrapper
...
>>> @introspective
... def x(__name__):
... print __name__
...
>>> x()
x
>>> y = x
>>> y()
x
>>> del x
>>> y()
x
。。。尽管如您所见,您仍然只能返回函数定义时使用的名称,而不是它现在恰好绑定到的名称。在
在实践中,简短(正确的)答案是“不要这样做”。Python的一个基本事实是对象不知道它们绑定到了什么名称—如果您认为您的函数需要这些信息,那么您就做错了事情。在