我正在尝试调试以下方法。我的问题是,当我从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()
答案 0 :(得分:3)
这是预期行为。 getInStockItems()
是一个生成器函数,在迭代生成器之前,不会执行生成器函数的主体。
来自yield
expressions文档:
当调用生成器函数时,它返回一个称为生成器的迭代器。然后该生成器控制生成器函数的执行。当调用其中一个生成器的方法时,执行开始。那时,执行继续执行第一个
yield
表达式,再次暂停它,将expression_list
的值返回给生成器的调用者。
行dataset = getInStockItems(c)
创建该生成器。您将生成器传递给insertNewDataInDatabase()
,for
循环开始迭代生成器。迭代意味着调用generator.next()
method,推进生成器函数。
因此,在for each in items:
开始执行之前,getInStockItems()
什么都不做。在生成器上调用.next()
开始运行该函数,直到yield
语句将第一个i[0]
表达式返回到for
循环,此时生成器函数再次被挂起