Python跳过方法

2024-10-03 15:33:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我尝试调试以下方法。我的问题是,当我从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()

Tags: 方法inforexecutereturnmaindefitems
1条回答
网友
1楼 · 发布于 2024-10-03 15:33:29

这是预期的行为getInStockItems()是一个生成器函数,在遍历生成器之前,不会执行生成器函数体。你知道吗

^{} expressions文档中:

When a generator function is called, it returns an iterator known as a generator. That generator then controls the execution of a generator function. The execution starts when one of the generator’s methods is called. At that time, the execution proceeds to the first yield expression, where it is suspended again, returning the value of expression_list to generator’s caller.

dataset = getInStockItems(c)创建了该生成器。将生成器传递给insertNewDataInDatabase()for循环开始在生成器上迭代。迭代意味着调用^{} method,推进生成器函数。你知道吗

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

相关问题 更多 >