Файл закрывается автоматически в Python после того, как он выходит из области видимости? - PullRequest
22 голосов
/ 08 марта 2010

Если я сделаю следующее, файловый дескриптор автоматически закроется, так как он выходит из области видимости в Python:

def read_contents(file_path):
  return file(file_path).read()

Если это не так, как я могу написать эту функцию для автоматического закрытия области?

Ответы [ 2 ]

34 голосов
/ 08 марта 2010

Чтобы развернуть ответ FogleBird, если вы явно не закроете его, файл будет автоматически закрыт при уничтожении объекта файла. В CPython это произойдет, как только на него больше не будет ссылок, например, если это локальная переменная в функции и функция завершается. Однако, если в функцию выдается исключение, а файл явно не закрывается с помощью оператора with или try:...finally:, тогда ссылка на файл будет сохранена как часть трассировки стека в объекте трассировки, и файл не будет быть закрытым, по крайней мере, до следующего исключения.

Также IronPython и Jython используют средства сбора мусора .Net CLR и Java JVM соответственно. Это не подсчитанные ссылки, поэтому файл будет оставаться открытым до тех пор, пока сборщик мусора не решит восстановить память объекта или программа не завершится.

Так что в общем случае важно явно закрыть файл, используя with: или try:...finally:.

Конечно, все это верно для любого другого типа объекта, который требует явной очистки.

20 голосов
/ 08 марта 2010

Он должен закрывать дескриптор файла в операторе __del__ файла, но лучше использовать блок with:

def read_contents(file_path):
  with open(file_path, 'r') as f:
    return f.read()

См. http://docs.python.org/library/stdtypes.html#file.close для получения дополнительной информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...