由于差异而刚刚脱掉我的头发,我想知道Python 2.5中真正的区别是什么。
我有两个代码块(dbao.getConnection()
返回一个MySQLdb连接)。
conn = dbao.getConnection()
with conn:
# Do stuff
和
with dbao.getConnection() as conn:
# Do stuff
我认为这些会产生相同的效果,但显然不是后一版本的conn
对象是Cursor
。光标来自哪里,而 有一种方法可以将变量初始化和语句组合在一起吗?
答案 0 :(得分:30)
乍一看可能有点令人困惑,但
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
是上下文管理器对象本身。
答案 1 :(得分:18)
一般而言,as
语句的with
部分指定的值将是__enter__
method of the context manager返回的值。
答案 2 :(得分:1)
with语句允许例如确保事务正确启动和停止。
如果是python中的数据库连接,我认为自然要做的就是在with语句的开头创建一个游标,然后在它结束时提交或回滚事务。
从with语句的角度来看,你给出的两个块是相同的。您也可以将as添加到第一个并获取光标。
您需要检查如何在您使用它的对象中实现with支持。
请参阅http://docs.python.org/whatsnew/2.5.html#pep-343-the-with-statement