gpt4 book ai didi

python - python闭包中的cell_contents

转载 作者:太空宇宙 更新时间:2023-11-03 21:27:06 26 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/53777819/

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