Подтвердить что ты не робот

Хорошая практика зависит от python с... как утверждение

Мне любопытно, считается ли безопасным или хорошей практикой зависимость от python с... как утверждение. Например, при открытии файла:

with open("myfile","w") as myFile:
    #do something

Итак, в этом примере я пренебрег явным вызовом myFile.close(), но могу предположить, что он был вызван, когда python вышел из оператора with...as, вызвав метод __exit__(). Является ли это хорошей практикой/безопасностью, чтобы зависеть от этого или было бы лучше всегда явно называть file.close()

4b9b3361

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