Подтвердить что ты не робот

Будет ли поток Python io автоматически закрываться в понимании списка?

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

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

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

4b9b3361

Ответ 1

"Может быть".

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

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

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

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

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

И, как указывает @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]