2009-05-24 46 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是上下文管理器对象本身。