A instrução Python * with * é exatamente equivalente a um bloco try - (except) - finalmente?

Sei que isso foi amplamente discutido, mas ainda não consigo encontrar uma resposta para confirmar isso: é ocom instrução idêntica à chamada do mesmo código em um bloco try (exceto) -finally, em que o que quer que seja definido no__exit__ função do gerenciador de contexto é colocada no bloco finalmente?

Por exemplo - esses dois trechos de código estão fazendo exatamente a mesma coisa?

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

o mesmo que:

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

Obrigado!

questionAnswers(1)

yourAnswerToTheQuestion