Учтите следующее:
with open(path, mode) as f:
return [line for line in f if condition]
Будет ли файл закрыт должным образом, или использование return
каким- либо образом обходить менеджер контекста ?
python
return
with-statement
Lightbreeze
источник
источник
else
можно было бы добавить,with
чтобы решить этуtry with except
проблему. Редактировать: добавлено в языкProcess.terminate()
это один из немногих (единственный?) Сценарий, который не гарантирует вызоваfinally
оператора: «Обратите внимание, что обработчики выхода и предложения finally и т. Д. Не будут казнены «.os._exit
Иногда используется @RikPoggi - он выходит из процесса Python без вызова обработчиков очистки.with
блока, гарантия будет действительна до тех пор, пока генератор продолжает давать значения? до тех пор, пока что-нибудь ссылается на это? Т.е. мне нужно использоватьdel
или присвоить другое значение переменной, которая содержит объект генератора?ValueError: I/O operation on closed file.
.Да.
..это в значительной степени эквивалентно:
Точнее,
__exit__
метод в диспетчере контекста всегда вызывается при выходе из блока (независимо от исключений, возвратов и т. Д.). Метод файлового объекта__exit__
просто вызываетf.close()
(например, здесь, в CPython )источник
finally
keywrod является:def test(): try: return True; finally: return False
.Да. В более общем смысле
__exit__
метод диспетчера контекста With Statement действительно вызывается в случае, еслиreturn
внутри контекста. Это можно проверить с помощью следующего:Выход:
Вывод выше подтверждает, что
__exit__
звонили несмотря на раннееreturn
. Таким образом, менеджер контекста не обойден.источник
Да, но в других случаях может быть некоторый побочный эффект, потому что он может что-то делать (например, очищать буфер) в
__exit__
блокеисточник