В текущей реализации CPython оба обычно сразу закрывают файл. Тем не менее, язык Python не дает такой гарантии для второго - файл в конечном итоге будет закрыт, но финализатор может быть вызван только до следующего цикла gc. Такие реализации, как Jython и IronPython, будут работать следующим образом, поэтому рекомендуется закрывать файлы явным образом.
Я бы сказал, что использование первого решения - лучшая практика, хотя open
обычно предпочтительнее file
. Обратите внимание, что вы можете немного сократить его, если предпочитаете краткость второго примера:
def file_get_contents(filename):
with open(filename) as f:
return f.read()
Часть __exit__
диспетчера контекста будет выполняться, когда вы покинете тело по любой причине, включая исключения и возврат из функции - нет необходимости использовать промежуточную переменную.