python的with语句

from sqlalchemy import create_engine
from sqlalchemy.orm import scoped_session, sessionmaker
from setting import EREBUS_DB_CONNECT_STRING
from contextlib import contextmanager

# 创建数据库引擎,echo为True,会打印所有的sql语句
engine = create_engine(EREBUS_DB_CONNECT_STRING, echo=True, pool_size=250, max_overflow=50, pool_recycle=300)# 创建会话类
db_session = scoped_session(sessionmaker(autocommit=False,
                                         autoflush=False,
                                         bind=engine,
                                         expire_on_commit=True))


# 创建会话对象
@contextmanager
def session(): #生成器函数
    try:
        session = db_session()
        session.expire_on_commit = False
        yield session
    except:
        session.rollback()
    finally:
        session.close()

装饰器@contextmanager 只是省略了 __enter__() / __exit__() 的编写,但并不负责实现资源的“获取”和“清理”工作;“获取”操作需要定义在 yield 语句之前,“清理”操作需要定义 yield 语句之后,这样 with 语句在执行 __enter__() / __exit__() 方法时会执行这些语句以获取/释放资源,即生成器函数中需要实现必要的逻辑控制,包括资源访问出现错误时抛出适当的异常

参考:

1、https://www.ibm.com/developerworks/cn/opensource/os-cn-pythonwith/index.html

2、https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001478651770626de401ff1c0d94f379774cabd842222ff000

原文地址:https://www.cnblogs.com/shengulong/p/7519770.html