2009-05-24 50 views
14

由於差異,我剛剛拉掉了我的頭髮,我想知道真的在Python 2.5中有什麼區別。Python'with'語句與'with .. as'

我有兩個代碼塊(dbao.getConnection()返回一個MySQLdb連接)。

conn = dbao.getConnection() 
with conn: 
    # Do stuff 

而且

with dbao.getConnection() as conn: 
    # Do stuff 

我認爲這將有同樣的效果,但顯然不如後者版本的conn對象是Cursor。光標從哪裏來,有沒有辦法將變量初始化和語句結合起來?

+4

第二個版本初始化變量conn。你有什麼實際問題?什麼工作不同?你得到了什麼錯誤?你能包括一些輸出來顯示問題嗎? – 2009-05-24 11:21:38

+0

對不起。認爲從描述中可以清楚看到。 dbao.getConnection()返回一個MySQLdb連接,所以conn = dbao.getConnection()將導致conn爲Connection對象,而「dbao.getConnection()as conn」導致conn成爲Cursor對象。錯誤消息是在後一種情況下,conn沒有回滾方法,因爲它是一個Cursor,所以它不應該有這種方法。 – 2009-05-24 21:12:35

回答

1

with語句允許例如確保事務正確啓動和停止。

在python中的數據庫連接的情況下,我認爲自然要做的是在with語句的開頭創建一個遊標,然後在其末尾提交或回滾事務。

您給出的兩個模塊與with聲明的觀點相同。您也可以添加as至第一個,並獲取光標。

您需要檢查如何在您使用的對象中實現with with support。

http://docs.python.org/whatsnew/2.5.html#pep-343-the-with-statement

29

可能乍一看有點混亂,但

with babby() as b: 
    ... 

相當於

b = babby() 
with b: 
    ... 

想知道爲什麼,這裏是如何的上下文管理器將實施:

class babby(object): 
    def __enter__(self): 
     return 'frigth' 

    def __exit__(self, type, value, tb): 
     pass 

在第一種情況下,名稱b將被綁定到上下文管理器的__enter__方法返回的任何內容。這通常是上下文管理器本身(例如文件對象),但它不一定是;在這種情況下,它是字符串'frigth',在你的情況下它是數據庫遊標。

在第二種情況下,b是上下文管理器對象本身。