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

Hub*_*bro 7 python with-statement python-3.x

我正在学习Python,我正在尝试这个with **** as ****:陈述.我认为它的工作方式与C#很相似using(****) {,但我担心我会跟踪过时的例子.

这是我的代码:

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

import pprint

pow = 1, 2, 3

with pprint.pprint as pprint:
    pprint(pow)
Run Code Online (Sandbox Code Playgroud)

我假设这里发生的事情是pprint在我的小闭包中是pprint.pprint函数的别名.我遇到了一个奇怪的错误:

Traceback (most recent call last):
  File "test.py", line 7, in <module>
    with pprint.pprint as pprint:
AttributeError: __exit__
Run Code Online (Sandbox Code Playgroud)

所以现在我想我正在使用旧版Python的语法,就像我之前做的那样(print "Hello")

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

Mik*_*kel 10

with 不是这样的.

它被设计为在块的末尾自动清理对象,例如,而不是

file = open('foo.txt')
# do stuff
close(file)
Run Code Online (Sandbox Code Playgroud)

你可以做

with open('foo.txt') as file:
    # do stuff
Run Code Online (Sandbox Code Playgroud)

并且关闭自动发生.

有关详细信息,请参阅PEP 343 - "with"语句以及Python 2.5中的新增功能 - PEP 343,了解有关如何使用它的更多示例.

  • 是的,但回答一个关于上下文管理器和`__exit__`的详细信息的简单问题会让我感到困惑. (2认同)

Rem*_*ank 6

with声明并非旨在满足您的期望.它使用"上下文管理器协议",因此,期望传递上下文管理器.

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

import pprint

pow = 1, 2, 3

pp = pprint.pprint
pp(pow)
Run Code Online (Sandbox Code Playgroud)

  • 或者`来自pprint import pprint`.或者`从pprint import pprint as pp` (8认同)