Хорошая практика зависит от python с... как утверждение
Мне любопытно, считается ли безопасным или хорошей практикой зависимость от python с... как утверждение. Например, при открытии файла:
with open("myfile","w") as myFile:
#do something
Итак, в этом примере я пренебрег явным вызовом myFile.close()
, но могу предположить, что он был вызван, когда python вышел из оператора with...as
, вызвав метод __exit__()
. Является ли это хорошей практикой/безопасностью, чтобы зависеть от этого или было бы лучше всегда явно называть file.close()
Ответы
Ответ 1
Вот для чего предназначены менеджеры контекста, чтобы полагаться на них, чтобы закрыть файл для вас. Контекстные менеджеры вызывается, даже если есть исключение.
Альтернативой является вместо этого использование блока finally
:
myFile = open("myfile","w")
try:
# do something with myFile
finally:
myFile.close()
но поскольку блок внутри try:
может быть длинным, к тому времени, как вы дойдете до инструкции finally
, вы забыли, что вы настраивали для этого.
Контекстные менеджеры еще более эффективны. Поскольку метод __exit__
информирован о любых исключениях, они также могут выступать в роли обработчиков исключений (игнорировать исключение, поднять другое и т.д.).
Ответ 2
Да, оператор with
- лучший способ. Начиная с Python 2.5, файловый объект был оснащен методами __enter__()
и __exit__()
. Метод __exit__()
закрывает объект файла.
Python гарантирует, что он вызовет метод __exit__()
, но не гарантирует, что метод __exit__()
закроет ресурс, особенно с сторонним кодом. Вам нужно вручную проверить это.