在 Python 中将对象传递到 yield 语句中



我有一个脚本,可以从数据库发出各种读取请求(我有许多类似于read()方法的方法(。我想避免重复创建和关闭光标的代码。所以我正在携手使用上下文管理器和生成器。(在下面的代码中,db_connection是一个 mysql 连接器对象。

from contextlib import contextmanager
class DatabaseReader():
  def __init__(self, db_connection):
    self.db_connection = db_connection
    self.num = num
  @contextmanager
  def connect(self):
    cursor = self.db_connection.cursor(buffered=True)
    try:
      yield
    finally:
      cursor.close()
  def read(self):
    with self.connect():
      cursor.execute("SELECT * FROM table;")

但是,调用"read"方法给了我一个AttributeError,因为没有定义cursor。如何将游标对象"传递"到 yield 语句?

在自定义实现中,您需要"生成"一个cursor对象,该对象将绑定在 with 语句的 as 子句中:

代码中需要 3 个修复:

  • 传递要分配给self.num = numnum
  • 屈服cursor
  • as关键字添加到语句with

from contextlib import contextmanager

class DatabaseReader():
    def __init__(self, db_connection, num):
        self.db_connection = db_connection
        self.num = num
    @contextmanager
    def connect(self):
        cursor = self.db_connection.cursor(buffered=True)
        try:
            yield cursor
        finally:
            cursor.close()
    def read(self):
        with self.connect() as cur:
            cur.execute("SELECT * FROM table;")

最新更新