2013-06-15 6 views
0

디버깅하려는 다음과 같은 방법이 있습니다. 내 문제는 main에서 insertNewDataInDatabase() 메서드를 호출하면 메서드의 for 루프가 시작되지만 데이터베이스 실행 문을 건너 뛰고 즉시 getInStockItems() 메서드로 이동하여 이해가되지 않는 경우입니다. 나 이미 그 메서드를 호출하고 insertNewDataInDatabase 그것을 호출하지 않기 때문에.파이썬 건너 뛰기 방법

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()의 각 행에 대해 실행되지만 실행 문으로 이동하는 대신 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] 표현식이 반환 될 때까지 해당 함수가 실행되기 시작합니다. 이때 생성기 함수가 다시 일시 중단됩니다.