Ist Python * mit * -Anweisung genau gleichbedeutend mit einem try - (außer) - finally-Block?

Ich weiß, dass dies viel diskutiert wurde, aber ich kann immer noch keine Antwort finden, um dies zu bestätigen: Ist dasmi -Anweisung ist identisch mit dem Aufruf des gleichen Codes in einem try - (except) -finally-Block, in dem alles definiert wird, was im @ definiert is__exit__ Funktion des Kontextmanagers wird in den finally-Block gestellt?

Beispiel: Tun diese 2 Code-Schnipsel genau dasselbe?

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..."

das Gleiche wie

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")

Vielen Dank

Antworten auf die Frage(1)

Ihre Antwort auf die Frage