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.
事实上,如果您仅依赖函数名称,如果该名称在全局变量空间(在定义函数的模块中)中被过度使用,则使用函数名称的引用将失败
更简单、更可维护的方法是为此编写一个装饰器,它将提供一个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