Доходность внутри двух функций - PullRequest
0 голосов
/ 19 января 2019

Я хотел бы получить доступ к каждому сгенерированному объекту отдельно, без необходимости выполнять итерации непосредственно по функции генератора.

У меня есть следующая функция «генератора», которая определяет, должен ли я загрузить файл или вернуть его как объект файла

def retrieve_file(content, to_download, filename):
    if to_download: 
        # Should download this file to the local computer
        with open(filename, 'wb') as f:
            f.write(content)
        return filename
    else:
        # Do not download, keep it as a file object
        output = StringIO()
        output.write(content)
        return output # Should be replaced with yield?

Следующая функция, которая фактически загружает файлы и вызывает предыдущую функцию

def get_all_files(to_download):
    for year in [2000, 2001, 20002, 2003]:
        content = download_file(year)
        result = retrieve_file(content,
                               to_download,
                               'file-%s.pdf' % year)
        return result

И основная функция, которая в этом случае загружает все файлы как объекты, а затем анализирует каждый файл отдельно.

def main():
    for file in get_all_files(True):
        parse_file(file)

В этом примере сработает удаление функции get_all_files и замена второго возврата в retrieve_file на yield. Проблема в том, что я хотел бы разделить 2 функции (main и get_all_files), потому что они находятся в двух разных модулях

1 Ответ

0 голосов
/ 19 января 2019

Просто замените return в вашем get_all_files на yield. Это позволит вам перебирать каждый файл.

def get_all_files(to_download):
    for year in [2000, 2001, 20002, 2003]:
        content = download_file(year)
        result = retrieve_file(content,
                               to_download,
                               'file-%s.pdf' % year)
        yield result
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...