Вы правы, так оно и работает. Однако это не рекомендуется, потому что кто-то, кто наследует ваш класс, может непреднамеренно разбить его.
В текущей реализации CPython оба обычно сразу закрывают файл. Однако язык Python не дает такой гарантии для второго - файл в конечном итоге будет закрыт, но финализатор не может быть вызван до следующего цикла gc. Такие реализации, как Jython и IronPython, будут работать таким образом, поэтому рекомендуется явно закрывать файлы.
Я бы сказал, что лучше всего использовать первое решение, хотя open
обычно предпочтительнее file
. Обратите внимание, что вы можете немного сократить его, если предпочитаете краткость второго примера:
def file_get_contents(filename):
with open(filename) as f:
return f.read()
Часть __ exit __
диспетчера контекста будет выполняться, когда вы оставите тело для any причина, включая исключения и возврат из функции - там '
Использование оператора with на самом деле лучший способ убедиться , что файл действительно закрыт.
В зависимости от поведения сборщика мусора для этой задачи может сработать, но в этом случае есть хороший способ быть уверенным во всех случаях, так что ...
import os
def file_get_contents(filename):
if os.path.exists(filename):
fp = open(filename, "r")
content = fp.read()
fp.close()
return content
В этом случае он вернет None, если файл не существует, и дескриптор файла будет закрыт перед выходом из функции.
с
обеспечит закрытие файла при выходе блока.
Во втором примере дескриптор файла может оставаться открытым (Python делает нет гарантии, что он закрыт или когда вы этого не сделаете явно).