Что такое идиома python RAII для переменного количества ресурсов?

Каков «лучший» способ открыть переменное количество файлов в python?

Я не могу понять, как использовать «с», если количество файлов заранее неизвестно.

(Входящие от RAII/C++)


person user1174648    schedule 28.01.2012    source источник
comment
Соответствующий stackoverflow.com/questions/5071121/   -  person Abhijeet Rastogi    schedule 28.01.2012
comment
Я не могу понять, что может означать количество файлов, неизвестное заранее. Можете ли вы объяснить этот алгоритм, который открывает (и сохраняет открытым) неизвестное количество файлов.   -  person S.Lott    schedule 28.01.2012
comment
Пример: сценарий, который берет переменное количество имен файлов в командной строке и чередует их все построчно в stdout .   -  person user1174648    schedule 28.01.2012


Ответы (2)


Что ж, вы можете определить свой собственный диспетчер контекста, который берет список пар (filename, mode) и возвращает список дескрипторов открытых файлов (а затем закрывает все эти дескрипторы при выходе из диспетчера контекста).

См. http://docs.python.org/reference/datamodel.html#context-managers и http://docs.python.org/library/contextlib.html для более подробной информации о том, как определить ваши собственные менеджеры контекста.

person Amber    schedule 28.01.2012
comment
Это полностью соответствует требованиям. - person user1174648; 28.01.2012
comment
После вашего четкого описания и повторного прочтения документов контекстного менеджера это кажется мне очень очевидным - теперь. Так что спасибо за деликатность с новичком! - person user1174648; 28.01.2012
comment
Если этот ответ удовлетворил ваши потребности, отметьте его как принятый, щелкнув контур галочки рядом с ним. Спасибо! - person Amber; 29.01.2012

В версии 3.3 для таких ситуаций теперь доступен contextlib.ExitStack. Вот пример кода из документации contextlib:

with ExitStack() as stack:
    files = [stack.enter_context(open(fname)) for fname in filenames]
    # All opened files will automatically be closed at the end of
    # the with statement, even if attempts to open files later
    # in the list raise an exception

2.7 пользователям не повезло. Еще одна причина обновиться.

person Kevin    schedule 04.02.2015