Поток Python io автоматически закроется в понимании списка?

Например, у меня есть следующий код:

d = [l for l in open('a.txt', 'r')]

Послеd Будет ли автоматически закрыт поток, открытый в списке?

Ответы на вопрос(1)

Решение Вопроса

В cPython, который использует пересчет, файл будет закрыт, как только закончится понимание списка (и все ссылки наfile объект потерян).

Но стандарт Python неrequire что это будет закрыто. Например, файл не будет немедленно закрыт в jython, который использует сборщик мусора JVM.

«Предпочтительный» метод обеспечения того, что ресурсы правильно закрыты, являетсяwith заявление:

with open(…) as f:
    d = [l for l in f]

этоwill гарантировать, что файл будет закрыт.

И, как указывает @astynax, вы можете использоватьd = f.readlines() здесь, поскольку это будет иметь ту же семантику, что и понимание списка.

Чтобы доказать это себе (в cpython):

>>> class Foo(object):
...     def __del__(self):
...         print "in __del__"
...     def __iter__(self):
...         return iter([1, 2, 3, 4])
...
>>> [ x for x in Foo() ]
in __del__
[1, 2, 3, 4]

Ваш ответ на вопрос