【问题标题】:yield as opposed to while True: yield usage in pythonyield 与 while True 相对:python 中的 yield 用法
【发布时间】:2018-01-27 10:35:02
【问题描述】:

我想构建一个辅助函数来从 sqlite 获取查询结果,用于与另一个数据库的结果进行比较。

我希望用户有一个简单的界面,他可以通过查询调用函数并获得结果,而无需任何其他准备。

我最终写了 2 个函数:

import sqlite3 
.
.
def sqlite_query_executor(query):
    conn=sqlite3.connect(':memory:')
    cur=conn.cursor()

    yield cur.execute(query).fetchall()[0][0]

还有一个要被用户调用的:

def query_sqlite(query):

    return next(sqlite_query_executor(query))

在修改第一个函数时,我最初写了另一个版本,结尾略有不同:

def sqlite_query_executor(query):
    conn=sqlite3.connect()
    cur=conn.cursor()

    while True:
        yield cur.execute(query).fetchall()[0][0]

两个版本似乎都运行良好,但我在机制上遇到了困难。

也许有人能阐明其中的区别吗?这种用例的正确模式是什么?

【问题讨论】:

  • 第一个函数在每次迭代时连接。这似乎表现不佳。
  • 所以光标一直保持连接?不需要关闭连接吗?
  • 当你真的不想要all时,你为什么还要为这些yieldnextfetchall烦恼?
  • @CoryMadden 这是一个测试套件,我假设如果它被调用,它会被称为一堆。
  • @user2357112 这是一个产生一个结果的单个查询,我猜常规提取也可以工作

标签: python sqlite generator yield coroutine


【解决方案1】:

fetchall() 工作量太大,应该换成fetchone()

def sqlite_query_executor(query):
    conn=sqlite3.connect()
    cur=conn.cursor()

    while True:
        yield cur.execute(query).fetchone()[0]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-11
    • 1970-01-01
    • 2020-04-07
    • 2010-12-14
    • 2016-06-01
    • 2015-08-05
    • 2017-11-14
    • 1970-01-01
    相关资源
    最近更新 更多