Python 3.2中的"with/as"做什么
我正在学习Python,试着用 with **** as ****:
这个语句。我觉得它的用法和C#里的 using(****) {
很像,但我有点担心我在用过时的例子。
这是我的代码:
# -*- coding: iso-8859-1 -*-
import pprint
pow = 1, 2, 3
with pprint.pprint as pprint:
pprint(pow)
我猜这里发生的事情是,我的小闭包里的 pprint
是 pprint.pprint
函数的别名。不过我遇到了一个奇怪的错误:
Traceback (most recent call last):
File "test.py", line 7, in <module>
with pprint.pprint as pprint:
AttributeError: __exit__
所以我现在在想,我是不是在用旧版本Python的语法,就像之前那样 (print "Hello"
)。
为什么我的代码没有按预期工作呢?
4 个回答
4
你在使用它的时候希望它能替代一个已经存在的名字,但在Python中,with
语句是需要传入一个上下文管理器的。pprint.pprint
不是一个上下文管理器。
18
with
不是那样工作的。
它的设计目的是在一个代码块结束时自动清理一个对象,比如说,代替下面的写法:
file = open('foo.txt')
# do stuff
close(file)
你可以这样写:
with open('foo.txt') as file:
# do stuff
这样关闭操作就会自动进行。
想了解更多细节,可以查看 PEP 343 -- "with" 语句,还有 Python 2.5 新特性 - PEP 343,里面有更多使用示例。
9
with
语句并不是用来做你想的那样的事情。它使用了一种叫做“上下文管理器协议”的东西,因此它需要一个被称为 上下文管理器 的东西。
如果你想创建一个别名,只需要把它赋值给一个新的变量就可以了:
import pprint
pow = 1, 2, 3
pp = pprint.pprint
pp(pow)