gpt4 book ai didi

python - python 闭包中的 cell_contents

转载 作者:太空狗 更新时间:2023-10-30 01:54:23 24 4
gpt4 key购买 nike

python 中对闭包的 cell_contents 调用有变化吗?我知道 func_closure 不起作用,而 __closure__ 起作用。

func.__closure__.cell_contents
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'tuple' object has no attribute 'cell_contents'

我正在使用 Python 3.4.1。

最佳答案

Has the cell_contents call for closures in python changed?

__closure__ 是,并且一直是单元元组(甚至在它被称为 func_closure 的时候)。

每个单元格仍然有一个 cell_contents 成员。但是元组当然不会。

所以,您想要的可能是其中之一:

func.__closure__[0].cell_contents

[cell.cell_contents for cell in func.__closure__]

值得注意的是,__closure__ 的细节是未记录的,并且是 CPython 实现的特定于实现的功能。而 data model__closure__ 定义为:

None or a tuple of cells that contain bindings for the function’s free variables.

…它没有说明这些单元格是什么,也没有说明它们有一个名为 cell_contents 的属性。

但是在 3.3+ 中,有一个记录的方法来获取此信息,inspect.getclosurevars :

>>> inspect.getclosurevars(func)
ClosureVars(nonlocals={'i': 1}, globals={}, builtins={}, unbound=set())

如果您想了解此函数返回的内容以外的更多信息,您可能想看看它是如何在您最喜欢的解释器(可能是 CPython,因为其他主要解释器都不支持 3.3)中实现的。 inspect 是那些旨在提供有用的、可读的源代码的模块之一,因此文档直接链接到 the source code .所以您可以看到它是如何工作的——但这基本上就是您所期望的;如果 __closure__ 不是 None,它只是创建一个字典,将 __code__.co_freevars 中的每个单元格名称映射到相应的 cell.cell_contents 来自元组。

如果您想更深入地了解闭包的内部结构,我不知道有什么好的解释(那会成为一篇很好的博文,我敢打赌有人写过……但我能找到的最好的一个快速谷歌是 Michael Foord 的 Nothing is Private: Python Closures (and ctypes) ,但是如果你知道 C 和 Python C API,CPython 的 function objectscode objects 的来源是非常可读的。你可能还想考虑查看 PyPy ,它往往是稍微复杂一点,不过都是用Python写的。PEP 227中还有一个简短的实现说明,在Python 2.1中添加了闭包,但解释不多。

关于python - python 闭包中的 cell_contents,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26094700/

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