Предположим, у меня есть файл test.txt
и вы хотите распечатать его. Я мог бы это сделать, как это в Python (это просто пример, чтобы проиллюстрировать мой вопрос, не пример хорошего кода):Файлы закрываются после оценки выражения генератора
for i in (line for line in open('test.txt')):
print ">", i,
Я использовал strace
, чтобы убедиться, что файл открыт и закрыт после кода выполнил.
Вопрос: Почему файл закрыт? Я предполагаю, что это имеет какое-то отношение к менеджерам контекста, но я не могу найти ссылку на этот тип конструкции и почему файл автоматически закрывается. Кто знает, что происходит именно за кулисами и может это объяснить?
Да, я знаю, что 'with ...:' существует. Вопрос в том, где это упоминается в документах: -> Кроме того, почему я не могу полагаться на то, что он автоматически закрывается, если он выходит за рамки? – hochl
@hochl Нет спецификации относительно того, как сбор мусора должен работать в Python. CPython делает это путем подсчета ссылок, но другие реализации могут делать это другими способами, производя разные результаты. Это также может означать, что файл не получается корректно, если у вас есть исключение. Однако самая большая причина - читаемость. Оператор 'with' делает ваше закрытие файла явным, что намного читаемо и меньше подвержено ошибкам. –
@hochl, потому что что вы ожидаете, когда объект выходит за рамки? Остаться в живых? Он становится помеченным для уничтожения и для файла, закрывая его, является частью процесса жизненного цикла. –