cell_contents是否在python中调用了闭包?我知道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'
Run Code Online (Sandbox Code Playgroud)
我使用的是Python 3.4.1.
aba*_*ert 11
cell_contents是否在python中调用了闭包?
__closure__是,并且一直是,一个单元格的元组(甚至在它被称为时func_closure).
每个细胞仍然有一个cell_contents成员.但是,元组当然没有.
所以,你想要的可能是其中之一:
func.__closure__[0].cell_contents
[cell.cell_contents for cell in func.__closure__]
Run Code Online (Sandbox Code Playgroud)
值得注意的是,详细信息__closure__是未记录的,并且是CPython实现的特定于实现的特性.而数据模型定义__closure__为:
None或者包含函数自由变量绑定的单元格元组.
...它没有说明这些单元格是什么,或者它们有一个名为的属性cell_contents.
但是在3.3+中,有一种记录的方式来获取这些信息,inspect.getclosurevars:
>>> inspect.getclosurevars(func)
ClosureVars(nonlocals={'i': 1}, globals={}, builtins={}, unbound=set())
Run Code Online (Sandbox Code Playgroud)
如果你想知道的不仅仅是这个函数返回的内容,你可能想看看它是如何在你最喜欢的解释器中实现的(这可能是CPython,因为没有其他主要的解释器支持3.3).inspect是那些旨在提供有用的可读源的模块之一,因此文档直接链接到源代码.所以你可以看到它是如何工作的 - 但它基本上是你所期望的; 如果__closure__不是None,它只是创建一个dict,将每个单元名称映射__code__.co_freevars到cell.cell_contents元组中的对应元素.
如果你想更深入,我不知道关闭内部的任何好的解释(这将成为一个很好的博客文章,我敢打赌有人写的一个...但我能找到的最好的快速谷歌是Michael Foord的Nothing是私有的:Python Closures(和ctypes),但是如果你知道C和Python C API ,CPython的函数对象和代码对象的来源是非常可读的.你可能也想考虑看PyPy,它往往是稍微复杂一点,但它都是用Python编写的.在PEP 227中还有一个简短的实现说明,它在Python 2.1中添加了闭包,但它没有解释太多.
| 归档时间: |
|
| 查看次数: |
928 次 |
| 最近记录: |