Как я могу открыть кучу файлов (с управлением контекстом), не вставляя кучу отступов

У меня есть одноразовый код, извлеченный из функции удаления десятков тысяч каталогов и их содержимого. Это нормально, но мне интересно, могу ли я использовать «с open () как» для кучи файлов без отступов, отступов и отступов...

with open(deleted_dirs, 'w') as out_removed:
    with open(unsuccessful_targets, 'w') as out_fail:
        with open(already_gone, 'w') as out_nowhere:
            for target in targets:
                try:
                    shutil.rmtree(target, ignore_errors=False, onerror=on_fail_rmtree)
                    print(target, file=out_removed)
                except FileNotFoundError:
                    print(target, file=out_nowhere)
                except PermissionError:
                    logger.warning('Permission Error: {}'.format(target))
                    print(target, file=out_fail)
return

Этот вопрос затрагивает ту же тему, что и python: создайте блок with в нескольких менеджерах контекста. Эти два вопроса должны быть связаны, однако два важных момента отличают этот вопрос. 1) В этом вопросе используется канонический пример использования диспетчера контекста: «с open(f) as fd:» по сравнению с упоминанием объектов «блокировки», доступных из диспетчера контекста (очевидно, то же самое, но не так очевидно) и что важнее 2) Тщательный поиск не дал ни предыдущего вопроса, ни ответов на него. (Возможно, это было еще более затруднено из-за абсолютной вездесущности слов «с», «как», «контекст» и «менеджер» как плохих поисковых терминов, а также из-за того, что ключевое слово «контекстный менеджер» невозможно угадать.)


person mohawkTrail    schedule 15.04.2016    source источник


Ответы (1)


Это довольно просто. Пример открытия трех файлов на запись:

with open('file1', 'w') as f1, open('file2', 'w') as f2, open('file3', 'w') as f3:
    # do stuff
person timgeb    schedule 15.04.2016
comment
Да, очень красиво, но есть ли в нем размашистая грация более архитектурного оригинала. - person mohawkTrail; 16.04.2016