什么是Python 3.2;带/as";做

什么是Python 3.2;带/as";做,python,python-3.x,with-statement,Python,Python 3.x,With Statement,我正在学习Python,我正在用****as****:语句尝试。我认为它的工作原理很像C#的使用(****){,但我恐怕是在遵循过时的示例 这是我的代码: # -*- coding: iso-8859-1 -*- import pprint pow = 1, 2, 3 with pprint.pprint as pprint: pprint(pow) 我假设这里发生的是pprint,在我的小闭包中是pprint.pprint函数的别名。不过我得到了一个奇怪的错误: Traceba

我正在学习Python,我正在用****as****:语句尝试
。我认为它的工作原理很像C#的
使用(****){
,但我恐怕是在遵循过时的示例

这是我的代码:

# -*- 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__
回溯(最近一次呼叫最后一次):
文件“test.py”,第7行,在
使用pprint.pprint作为pprint:
AttributeError:\uuu退出__
所以现在我想我使用的是一个较旧版本的Python语法,就像我之前使用的一样(
print“Hello”


为什么我的代码不能按预期工作?

您正在使用它,希望它能别名现有名称,但是。
pprint.pprint
不是上下文管理器。

的工作方式不同

其设计用于自动清理块末端的对象,例如,代替

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

with open('foo.txt') as file:
    # do stuff
并且自动关闭


有关详细信息以及如何使用它的更多示例,请参阅。

with
语句的目的并不是要实现您所期望的功能。它使用“上下文管理器协议”,因此,希望传递一个消息

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

import pprint

pow = 1, 2, 3

pp = pprint.pprint
pp(pow)

别名不是
with
的用途。您可能想要的是:

from pprint import pprint

pow = 1, 2, 3
pprint(pow)

并不是说
with
需要清理它,而是上下文管理器需要清理自己,而
with
需要适当地管理它的生命周期。是的,但是回答一个关于上下文管理器和
\uu exit\uuu
的简单问题会让IMHO太困惑。或者从pprint导入pprint的
。或者
从pprint导入pprint as pp
我假设别名必须是块的本地别名,看看OP如何尝试使用
with
语句。如果没有必要,在导入时重命名确实是最好的解决方案。您可以在此处阅读关于“as”语句的更多信息:这应该会使“import..as..”和“有..有..有..”清楚这些不是你要找的机器人。。。