我最近发现了Python with关键字并开始看到它的潜在用处,可以更好地处理我以前使用过try: ... finally: ...构造的一些场景.我立即决定在我编写的一些代码中尝试使用MySQLdb连接对象.
我没有理会读取Python数据库API的实现者的方式__enter__和__exit__行为,并天真地期望行为与文件对象的行为一样 - 我所期待的只是退出调用connection.close().
想象一下,在这种行为中我的困惑:
>>> with util.get_db_connection() as conn:
... print conn
...
<MySQLdb.cursors.Cursor object at 0xb6ca8b4c>
Run Code Online (Sandbox Code Playgroud)
get_db_connection()返回一个MySQLdb连接对象,但该连接对象的__enter__方法返回一个游标对象,而不是连接对象本身,就像我期望给出文件对象的方式__enter__和__exit__工作方式一样.我想我应该做with util.get_db_connection() as cursor:,或者根本不用with.
这个发现立刻让我想到了一些事情:
__enter__和__exit__MySQLdb的连接对象的方法吗?__exit__如果没有我明确要求发生这种变化,我是否会为我神奇地提交或回滚更改?还有什么不明显的我应该知道的吗?ctrl-f的最新规范(PEP 249 - Python数据库API规范v2.0)不会抛出任何东西.