python闭包中的cell_contents - python

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'

我正在使用Python 3.4.1。

python参考方案

cell_contents要求在python中关闭吗?

__closure__是(并且一直是)一个元组元组(甚至早在被称为func_closure时)。

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

因此,您想要的可能是以下之一:

func.__closure__[0].cell_contents

[cell.cell_contents for cell in func.__closure__]

值得注意的是,__closure__的详细信息尚未记录,并且是CPython实现的特定于实现的功能。而data model将__closure__定义为:

  None或包含该函数的自由变量绑定的单元格元组。

……它没有说明这些单元格是什么,也没有说它们具有名为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

如果您想更深入一点,我不知道对闭包的内部有任何好的解释(那将是一篇不错的博客文章,我敢打赌有人写了一个...但是最好的是我可以在快速的google中找到的)是Michael Foord的Nothing is Private: Python Closures (and ctypes),但是如果您了解C和Python C API,CPython的function objects和code objects的源代码就很容易理解了,您可能还想考虑一下PyPy,这可能会更多PEP 227中有一个简短的实现说明,该实现在Python 2.1中添加了闭包,但解释不多。

Python sqlite3数据库已锁定 - python

我在Windows上使用Python 3和sqlite3。我正在开发一个使用数据库存储联系人的小型应用程序。我注意到,如果应用程序被强制关闭(通过错误或通过任务管理器结束),则会收到sqlite3错误(sqlite3.OperationalError:数据库已锁定)。我想这是因为在应用程序关闭之前,我没有正确关闭数据库连接。我已经试过了: connectio…

Python pytz时区函数返回的时区为9分钟 - python

由于某些原因,我无法从以下代码中找出原因:>>> from pytz import timezone >>> timezone('America/Chicago') 我得到:<DstTzInfo 'America/Chicago' LMT-1 day, 18:09:00 STD…

用大写字母拆分字符串,但忽略AAA Python Regex - python

我的正则表达式:vendor = "MyNameIsJoe. I'mWorkerInAAAinc." ven = re.split(r'(?<=[a-z])[A-Z]|[A-Z](?=[a-z])', vendor) 以大写字母分割字符串,例如:'我的名字是乔。 I'mWorkerInAAAinc”变成…

如何打印浮点数的全精度[Python] - python

我编写了以下函数,其中传递了x,y的值:def check(x, y): print(type(x)) print(type(y)) print(x) print(y) if x == y: print "Yes" 现在当我打电话check(1.00000000000000001, 1.0000000000000002)它正在打印:<…

Python:检查新文件是否在文件夹中[重复] - python

This question already has answers here: How do I watch a file for changes? (23个答案) 3年前关闭。 我是python的新手,但是我尝试创建一个自动化过程,其中我的代码将侦听目录中的新文件条目。例如,某人可以手动将zip文件复制到一个特定的文件夹中,并且我希望我的代码能够在文件完全…