Я знаю, что это широко обсуждалось, но я до сих пор не могу найти ответ, чтобы подтвердить это: оператор with, идентичный тому, который вызывает тот же код в блоке try - (except) -finally, где все, что определено в __exit__
функция контекстного менеджера помещается в блок finally?
Например, эти два фрагмента кода делают одно и то же?
import sys
from contextlib import contextmanager
@contextmanager
def open_input(fpath):
fd = open(fpath) if fpath else sys.stdin
try:
yield fd
finally:
fd.close()
with open_input("/path/to/file"):
print "starting to read from file..."
то же самое, что:
def open_input(fpath):
try:
fd = open(fpath) if fpath else sys.stdin
print "starting to read from file..."
finally:
fd.close()
open_input("/path/to/file")
Спасибо!