Python跳过方法

时间:2013-06-15 16:43:02

标签: python sqlite debugging generator

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

1 个答案:

答案 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循环,此时生成器函数再次被挂起