我发现了这样的代码块:
with a as b:
c = b.algo()
它看起来像一些类似于的动态namespaces
,但是下面的代码
a = 1
with a as b:
print a, b
返回以下错误:
AttributeError: __exit__
那么关键字是什么with
,它是如何工作的呢?的作用是__exit__
什么?
我发现了这样的代码块:
with a as b:
c = b.algo()
它看起来像一些类似于的动态namespaces
,但是下面的代码
a = 1
with a as b:
print a, b
返回以下错误:
AttributeError: __exit__
那么关键字是什么with
,它是如何工作的呢?的作用是__exit__
什么?
该子句
with
在 python 中没有像 VB 等其他语言那样具有分隔命名空间(“namespaces” )的功能。它更多地用于确定代码块将具有的语言环境,称为“上下文”。“上下文”基本上设置有初始设置和检索先前值的结束。一个例子是打开一个文件:
我们通过打开文件开始块,最后,文件将自动关闭,即使没有明确指出。
为了控制上下文,使用了“上下文管理器”(“上下文管理器”),它们是具有方法
__enter__
和__exit__
. 第一个初始化上下文,第二个结束它。python 中的对象实现了上下文管理器
files
接口,因此在上下文中使用它们将确保文件正确关闭。标准库中还有更多实现上下文管理器接口的对象。最重要的之一是 type
Decimal
,您可以通过上下文指定要在块内执行的操作的小数精度:还有一些库,例如fabric,它们使用上下文来配置要在其上执行脚本的服务器的连接。
在您的情况下,您得到的错误是该变量没有定义的上下文管理器
a
方法。有关更多详细信息,请参阅PEP-343