Python 3.2中的"with/as"做什么

13 投票
4 回答
27668 浏览
提问于 2025-04-16 16:21

我正在学习Python,试着用 with **** as ****: 这个语句。我觉得它的用法和C#里的 using(****) { 很像,但我有点担心我在用过时的例子。

这是我的代码:

# -*- coding: iso-8859-1 -*-

import pprint

pow = 1, 2, 3

with pprint.pprint as pprint:
    pprint(pow)

我猜这里发生的事情是,我的小闭包里的 pprintpprint.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)

撰写回答