2013-06-15 4 views
0

У меня есть следующие методы, которые я пытаюсь отлаживать. Моя проблема заключается в том, что когда я вызываю метод insertNewDataInDatabase() из main, он переходит к началу цикла for в методе, но пропускает оператор выполнения базы данных и сразу переходит к методу getInStockItems(), который не имеет смысла меня, потому что я уже вызвал этот метод, а insertNewDataInDatabase не вызвал его.Способы пропуска Python

dataset - это объект-генератор, если он имеет отношение к проблеме.

Любая помощь была бы высоко оценена!

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

Я следую за ним в отладчике Pycharm. Он попадает на каждую строку в insertNewDataInDatabase(), но вместо перехода к выражению execute он переходит к getInStockItems –

ответ

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, после чего функция генератора снова приостанавливается.