9

我正在学习 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 回答 4

14

with不能那样工作。

它旨在自动清理块末尾的对象,例如,而不是

file = open('foo.txt')
# do stuff
close(file)

你可以做

with open('foo.txt') as file:
    # do stuff

并且关闭自动发生。

有关详细信息,请参阅PEP 343 -- The "with" 语句Python 2.5 中的新增功能 - PEP 343以获得更多关于如何使用它的示例。

于 2011-04-24T22:11:52.517 回答
8

with声明并不打算按照您的预期进行。它使用“上下文管理器协议”,因此期望传递一个上下文管理器

要创建别名,只需将其分配给一个新变量:

import pprint

pow = 1, 2, 3

pp = pprint.pprint
pp(pow)
于 2011-04-24T22:12:41.347 回答
3

您正在使用它期望它为现有名称起别名,但在 Python 中with期望传递一个 context managerpprint.pprint不是上下文管理器。

于 2011-04-24T22:08:56.623 回答
1

别名不是with目的。你可能想要的是这样的:

from pprint import pprint

pow = 1, 2, 3
pprint(pow)
于 2011-04-24T22:22:18.890 回答