gpt4 book ai didi

python - 函数如何稳定地引用自身?

转载 作者:太空狗 更新时间:2023-10-29 17:49:03 25 4
gpt4 key购买 nike

[原版代码乱七八糟。即使在我修复了代码之后,帖子中仍然存在一些非常困惑的拼写错误。我相信我最终也修复了所有这些问题。深表歉意。]

下面对 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

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

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

附言做这道题的动机只是为了更好地了解Python。

最佳答案

似乎引用 my_own_id 会在全局命名空间字典中查找 'my_own_id',因此它将始终是函数定义中使用的名称。由于该名称可以分配给不同的值,因此检索到的值也可以更改。如果您将 me 设置为默认参数,则可以在函数定义时将其分配给函数本身,以保留对实际函数的引用。

您可以使用这个装饰器,它将原始函数本身作为第一个参数隐式传递。

>>> from functools import wraps
>>> def save_id(func):
@wraps(func)
def wrapper(*args, **kwargs):
return func(func, *args, **kwargs)
return wrapper


>>> @save_id
def my_own_id(me): # me is passed implicitly by save_id
return id(me)

>>> alias = my_own_id
>>> alias()
40775152
>>> my_own_id = 'foo'
>>> alias()
40775152

关于python - 函数如何稳定地引用自身?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11908017/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com