2011-04-24 55 views
3

我正在學習Python和我想出來的with **** as ****:聲明。我想,這很像C#的using(****) {,但我怕我下面過時的例子。什麼的Python 3.2「帶/爲」做

這是我的代碼:

# -*- 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"

爲什麼不是我的代碼按預期工作?

+1

這些都不是你正在尋找...... – simon 2017-05-09 19:24:34

回答

5

with聲明不打算做你的期望。它使用「上下文管理器協議」,因此,預計會通過context manager

創建別名,只需將其分配到一個新的變量:

import pprint 

pow = 1, 2, 3 

pp = pprint.pprint 
pp(pow) 
+7

或'from pprint import pprint'。或'從pprint導入pprint作爲pp' – 2011-04-24 22:13:47

+1

我認爲別名必須是本地塊,看OP如何嘗試使用'with'語句。如果沒有必要,在導入處重命名確實是最好的解決方案。 – 2011-04-26 10:48:38

6

with不起作用這樣的。

它被設計用來在一個塊,例如結束時自動清理的物體而不是

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

你可以做

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

和關閉自動發生。

PEP 343 -- The "with" Statement的詳細信息和What's New in Python 2.5 - PEP 343爲你如何使用它的一些更多的例子。

+0

這並不是說'with'預計清理的機器人,它是上下文管理,預計清理自己,並且'與'適當地管理它的生命週期。 – 2011-04-24 22:13:43

+1

是的,但回答一個簡單的問題,關於上下文管理器和'__exit__'的詳細信息會讓IMHO太混亂。 – Mikel 2011-04-24 22:15:02

0

別名是不是有什麼with是。你可能需要的是這樣的:

from pprint import pprint 

pow = 1, 2, 3 
pprint(pow)