什么是Python 3.2;带/as";做
我正在学习Python,我正在用****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
。我认为它的工作原理很像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..”和“有..有..有..”清楚这些不是你要找的机器人。。。