Хорошая практика зависит от 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__() закроет ресурс, особенно с сторонним кодом. Вам нужно вручную проверить это.