2016-04-15 7 views
1

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

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: create a "with" block on several context managers. Эти два должны быть связаны, однако две важные вещи делают этот вопрос разным. 1) В этом вопросе используется канонический пример использования диспетчера контекстов: «с open (f) как fd:« по сравнению с упоминанием объектов «блокировки», которые можно получить из диспетчера контекста (очевидно, то же, но не так очевидно) и что более важно 2) Прилежный поиск не смог поднять предыдущий вопрос или его ответы. (Возможно, это стало более сложным из-за абсолютной вездесущности «с», «как», «контекста» и «менеджера» как плохих поисковых терминов, и что ключевое слово «contextmanager» неопровержимо.)

+0

Возможно, у вас возник вопрос по поводу обзора кода стека? – palsch

+2

Возможный дубликат [python: создать "с блоком для нескольких менеджеров контекста] (http://stackoverflow.com/questions/3024925/python-create-a-with-block-on-several-context-managers) –

+0

Спасибо, что указал на соответствующий вопрос. Хорошее соединение. Я не нашел его в поиске. – mohawkTrail

ответ

3

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

with open('file1', 'w') as f1, open('file2', 'w') as f2, open('file3', 'w') as f3: 
    # do stuff 
+0

Да, очень приятно, но имеет ли он потрясающую грацию более архитектурного оригинала. – mohawkTrail