0

我有以下要调试的方法。我的问题是,当我从 main 调用 insertNewDataInDatabase() 方法时,它会转到方法中 for 循环的开头,但会跳过数据库执行语句并立即转到 getInStockItems() 方法,这对我是因为我已经调用了该方法并且 insertNewDataInDatabase 没有调用它。

数据集是一个生成器对象,如果这与问题有关。

任何帮助将非常感激!

def deleteOldDataFromDatabase(company, c):
    c.execute('DELETE FROM company WHERE Company=?',(company,))


def insertNewDataInDatabase(items, c):
    for each in items:
        c.execute('INSERT INTO ammo VALUES (?, ?, ?, ?, ?, ?)', ("NULL", each["Company"], each["Value"],
                                                             each["Product"], each["Price"], each["Url"]))
def getInStockItems(c):
    for i in chain(ctd.main()):
        deleteOldDataFromDatabase(i[1], c)
        for each in i[0]:
            yield each

def retrieveDatafromDB(c):
    c.execute("SELECT * from company")
    return c.fetchall()

def main():
    with sqlite3.connect(database) as connection:
        c = connection.cursor()
        dataset = getInStockItems(c)
        insertNewDataInDatabase(dataset, c)
        return retrieveDatafromDB(c)

if __name__ == '__main__':
    main()
4

1 回答 1

3

这是预期的行为getInStockItems()是一个生成器函数,并且在您迭代生成器之前不会执行生成器函数的主体。

yield表达式文档中:

当调用生成器函数时,它返回一个称为生成器的迭代器。然后该生成器控制生成器函数的执行。当调用生成器的方法之一时开始执行。那时,执行继续到第一个yield表达式,在那里它再次暂停,将值返回expression_list给生成器的调用者。

该行dataset = getInStockItems(c)创建了该生成器。您将生成器传递给insertNewDataInDatabase()并且for循环开始迭代生成器。迭代意味着调用generator.next()方法,推进生成器函数。

所以,直到for each in items:开始执行,getInStockItems()什么都不做。调用.next()生成器开始运行该函数,直到yield语句将第一个i[0]表达式返回到for循环,此时生成器函数再次挂起。

于 2013-06-15T16:46:27.683 回答