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

Mik*_*nen 15 python syntax

由于差异我刚刚脱掉头发,我想知道Python 2.5中的差异究竟是什么.

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

conn = dbao.getConnection()
with conn:
    # Do stuff
Run Code Online (Sandbox Code Playgroud)

with dbao.getConnection() as conn:
    # Do stuff
Run Code Online (Sandbox Code Playgroud)

我认为这些会有相同的效果,但显然不是conn后一版本的对象是一个Cursor.哪里光标来自并且有办法的变量初始化,并声明以某种方式结合起来?

dF.*_*dF. 32

乍一看可能有点令人困惑,但是

with babby() as b:
    ...
Run Code Online (Sandbox Code Playgroud)

不是等同于

b = babby()
with b:
    ...
Run Code Online (Sandbox Code Playgroud)

要了解原因,以下是上下文管理器的实现方式:

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

    def __exit__(self, type, value, tb):
        pass
Run Code Online (Sandbox Code Playgroud)

在第一种情况下,名称b将绑定到从__enter__上下文管理器的方法返回的任何内容.这通常是上下文管理器本身(例如对于文件对象),但它不一定是; 在这种情况下,它是字符串'frigth',在您的情况下,它是数据库游标.

在第二种情况下,b是上下文管理器对象本身.

  • @Mikko:恕我直言,这是更好的方法-如果出于其他原因而不是更详细地讨论差异,则应回答并应被接受。 (2认同)

小智 19

一般而言,语句as部分分配的值将with__enter__上下文管理器方法返回的值.