Записывается ли файл-манипулятор автоматически в Python после того, как он выходит из области видимости?

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

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

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

Ответ 1

Он должен закрыть дескриптор файла в файле __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.

Ответ 2

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

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

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

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