一个函数如何能够稳定地引用自身?

kjo*_*kjo 12 python introspection

[原始版本中的代码严重混乱.即使在我修改了代码之后,仍有几个高度混乱的错别字留在帖子中.我相信我终于修复了所有这些.深表歉意.]

下面的两个调用alias产生不同的输出,因为与变量关联的对象my_own_id在两个调用之间发生变化:

>>> def my_own_id():
...     me = my_own_id
...     return id(me)
... 
>>> alias = my_own_id
>>> alias()
4301701560
>>> my_own_id = None
>>> alias()
4296513024
Run Code Online (Sandbox Code Playgroud)

我可以me在定义中分配什么,my_own_id以便随后重新定义my_own_id变量时其输出保持不变?(IOW,所以内部me变量总是引用相同的函数对象?)

(我可以获取当前帧(带inspect.currentframe()),但它只包含对当前代码对象的引用,而不包含对当前函数的引用.)

PS这个问题的动机只是为了更好地了解Python.

jsb*_*eno 2

事实上,如果您仅依赖函数名称,如果该名称在全局变量空间(在定义函数的模块中)中被过度使用,则使用函数名称的引用将失败

更简单、更可维护的方法是为此编写一个装饰器,它将提供一个nonlocal包含对函数本身的引用的变量。

from functools import wraps

def know_thyself(func):
   @wraps(func):
   def new_func(*args, **kwargs):
        my_own_id = func
        return func(*args, **kwargs)
   return new_func
Run Code Online (Sandbox Code Playgroud)

并且可以用作:

>>> @know_thyself
... def my_own_id():
...     me = my_own_id
...     return id(me)
... 
Run Code Online (Sandbox Code Playgroud)

还有另一种可能的方法,远非如此干净,使用框架内省并重新使用相同的目标代码重建新函数。我在这篇关于 Python 中的自引用 lambda 表达式的文章中使用了这个: http://metapython.blogspot.com.br/2010/11/recursive-lambda-functions.html