Interpretación de la declaración de Python con ... como

La declaración with se usa para envolver la ejecución de un bloque con los métodos definidos por el administrador de contexto. Esto permite la encapsulación de patrones de uso comunes de intento... excepto... finalmente para una fácil reutilización.

with_stmt          ::=  "with" ( "(" with_stmt_contents ","? ")" | with_stmt_contents ) ":" suite
with_stmt_contents ::=  with_item ("," with_item)*
with_item          ::=  expression ["as" target]

 La ejecución de una instrucción with con un "elemento" es la siguiente:

Evalúe la expresión de contexto (la dada en with_item) para obtener un administrador de contexto.

Cargue el __enter__() del administrador de contexto para su uso posterior.

Cargue el __exit__() del administrador de contexto para su uso posterior.

Se llama al método __enter__() del administrador de contexto.

Si el objetivo está contenido en una declaración with, se le asigna el valor de retorno de __enter__().

Tenga en cuenta que la instrucción with garantiza que siempre se llamará a __exit__() si el método __enter__() regresa sin error. Por lo tanto, si ocurre un error durante la asignación a la lista de objetivos, se tratará como un error que ocurre dentro de la suite. Vea los pasos a continuación 

Se llama al método __exit__() del administrador de contexto. Si una excepción provocó la salida del conjunto, su tipo, valor y rastreo se pasan como argumentos a __exit__(). De lo contrario, proporcione tres argumentos Ninguno.

Si la suite sale con una excepción y el método __exit__() devuelve falso, la excepción se vuelve a generar. Si el valor devuelto es verdadero, la excepción se suprime y la ejecución continúa con la instrucción que sigue a la instrucción with.

Si la suite sale por cualquier motivo que no sea una excepción, el valor de retorno de __exit__() se ignora y la ejecución continúa en el lugar normal con el tipo de salida tomada.

el siguiente código

with EXPRESSION as TARGET:
    SUITE

es semánticamente equivalente a:

manager = (EXPRESSION)
enter = type(manager).__enter__
exit = type(manager).__exit__
value = enter(manager)
hit_except = False

try:
    TARGET = value
    SUITE
except:
    hit_except = True
    if not exit(manager, *sys.exc_info()):
        raise
finally:
    if not hit_except:
        exit(manager, None, None, None)

Supongo que te gusta

Origin blog.csdn.net/weixin_46159962/article/details/128198421
Recomendado
Clasificación