Python的'with'语句与'with ... as'

时间:2009-05-24 11:17:24

标签: python syntax

由于差异而刚刚脱掉我的头发,我想知道Python 2.5中真正的区别是什么。

我有两个代码块(dbao.getConnection()返回一个MySQLdb连接)。

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

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

我认为这些会产生相同的效果,但显然不是后一版本的conn对象是Cursor。光标来自哪里,而 有一种方法可以将变量初始化和语句组合在一起吗?

3 个答案:

答案 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