- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
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 objects 和 code objects 的源代码是非常可读的。您可能还想考虑查看 PyPy ,这往往是稍微复杂一点,不过都是用Python写的。 PEP 227 里还有一个简短的实现说明,在Python 2.1中添加了闭包,但解释不多。
关于python - python闭包中的cell_contents,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53777819/
python 中对闭包的 cell_contents 调用有变化吗?我知道 func_closure 不起作用,而 __closure__ 起作用。 func.__closure__.cell_con
我正在制作一款 Connect 4 游戏。 我已经搜索过,但似乎找不到任何地方可以向我展示这会带来什么。 void display_board(enum cell_contents board[][B
我是一名优秀的程序员,十分优秀!