Python:with…as语法

with…as…:

with 的操作数中必须含有方法__enter__(),__exit__()。其中方法__enter__()的返回值作为as 操作数引用的对象。

一个操作数据库的小例子:

不使用with…as:

import pymysql

#获取连接对象
con = pymysql.connect('192.168.1.148', 'root', 'passwd', 'test', 3306)

#获取游标
cur = con.cursor()

#执行语句
cur.execute('select * from person')
data = cur.fetchone()

使用with…as:

import pymysql

with pymysql.connect('x.x.x.x', 'root', 'passwd', 'test', 3306) as cur:
    cur.execute('select * from person')
    data = cur.fetchone()

查看pymysql.connect源码,其中connect中__enter__(),__exit__()如下:

def __enter__(self):
    """Context manager that returns a Cursor"""
    return self.cursor()
def __exit__(self, exc, value, traceback):
    """On successful exit, commit. On exception, rollback"""
    if exc:
        self.rollback()
    else:
        self.commit()

(注:此__enter__()函数在connections模块Connection类型中定义。)

可以看到__enter__()直接返回Connection对象的游标,而这个游标直接作为as操作数引用的对象。所以with…as执行体中直接使用cur。

with…as执行体结束后调用__exit__(),__exit__()并未执行游标和连接的关闭。当执行体结束时候,连接还是处于打开的状态。

“Python:with…as语法”的一个回复

发表评论

电子邮件地址不会被公开。 必填项已用*标注