Напиши паука насквозь, но почему «доходность предмета» не работает во вложенном цикле for? - PullRequest
1 голос
/ 03 ноября 2019

У меня есть паук, пишущий насквозь, но полученный элемент не выполняется в цикле for, см. Код ниже.

def parse_paragraph(self, div_list, category_name, group_name):
    for div in div_list:
        duilian_text_list = div.xpath('./text()').extract()
        duilian_text_list = strip_list(duilian_text_list)
        if len(duilian_text_list) == 0:
            continue
        elif len(duilian_text_list) == 1:
            duilian_text = duilian_text_list[0]
            self.parse_duilian(duilian_text, category_name, group_name)
        elif len(duilian_text_list) == 2 and not is_single_line(duilian_text_list[0]):
            duilian_text = ''.join(duilian_text_list)
            self.parse_duilian(duilian_text, category_name, group_name)
        else:
            for duilian_text in duilian_text_list:
                duilian_item = DuilianItem()
                duilian_item['id'] = str(uuid.uuid4()).replace('-', '')
                duilian_item['category_id'] = getCategoryName(category_name)
                duilian_item['group_name'] = group_name
                duilian = parse_duilian(duilian_text)
                if duilian != '|':
                    duilian_item['name'] = duilian
                    duilian_item['desc'] = ''
                    duilian_item['author'] = ''
                    duilian_item['shuti'] = ''
                    duilian_item['word_count'] = len(duilian_item['name']) // 2
                    duilian_item['image_url'] = ''
                    print('-------I am here--------')
                    yield duilian_item

Когда я вызываю эту функцию, я ничего не получаю в окне вывода, кажется, строкаyiled duilian_item не работает, и это даже мешает выполнению другого кода (строка печати над ним).

Когда я закомментирую последнюю строку yiled duilian_item, все работает, и я получил -------I am here-------- вокно вывода, что здесь не так?

Проще говоря, следующий код ничего не печатает, но если я закомментирую yiled 1, он выводит список, поэтому yield в python не работает в цикле for?

def strange_yield():
    list = [1, 2, 3]
    for i in list:
        print(i)
        yield 1

strange_yield()

1 Ответ

2 голосов
/ 03 ноября 2019

Когда вы используете yield в функции python, функция становится функцией генератора. Правильный способ справиться с этим, следуя вашей функции strange_yield:

my_yield = strange_yield()

my_yield теперь является экземпляром функции генератора strange_yield. Функции генератора могут повторяться или получать следующее значение с помощью функции next():

print(next(my_yield))

или

for yield_value in my_yield:
  print(yield_value)
...