Sintaxis avanzada de Python _con y administrador de contexto

Sintaxis avanzada de Python

con y "Administrador de contexto"

Si tiene el hábito de leer el código fuente, es posible que vea un código excelente que a menudo aparece con declaraciones de palabras clave "con". ¿En qué escenarios se usan generalmente? esta

porPara los recursos del sistema, como archivos, conexiones de bases de datos y sockets, una vez que la aplicación abre estos recursos y ejecuta la lógica empresarial, una cosa que se debe hacer es cerrar (desconectar) los recursos.

Por ejemplo, un programa Python abre un archivo, escribe contenido en el archivo y luego cierra el archivo después de terminar de escribir. De lo contrario, ¿qué pasará? En casos extremos, aparecerá el error "Demasiados archivos abiertos", porque el número máximo de archivos que el sistema te permite abrir es limitado.

De manera similar, para la base de datos, si hay demasiadas conexiones y no se cierran a tiempo, puede aparecer "No se puede conectar al servidor MySQL Demasiadas conexiones", porque las conexiones a la base de datos son un recurso muy caro y no se pueden crear de forma ilimitada.

Veamos cómo cerrar un archivo correctamente.

versión regular

def m1():
    f = open("output.txt", "w")
    f.write("python之禅")
    f.close()

Existe un problema potencial con esta escritura. Si ocurre una excepción durante la llamada a escribir, el código subsiguiente no puede continuar ejecutándose y el método de cierre no puede ser llamado normalmente, por lo que el ocupante del programa siempre liberará el recurso. Entonces, ¿cómo podemos mejorar el código?

Versión avanzada

def m2():
    f = open("output.txt", "w")
    try:
        f.write("python之禅")
    except IOError:
        print("oops error")
    finally:
        f.close()

La versión mejorada del programa es intentar capturar el código donde puede ocurrir una excepción, usando la instrucción try / finalmente, lo que significa que si ocurre una excepción en el programa en el bloque de código try, el código subsiguiente ya no se ejecutará. , y saltará directamente al código except. Piece. En cualquier caso, el código del bloque finalmente se ejecutará eventualmente. Por lo tanto, siempre que ponga close en el código final, el archivo se cerrará.

Versión premium

def m3():
    with open("output.txt", "r") as f:
        f.write("Python之禅")

Una forma más concisa y elegante es utilizar la palabra clave with. El valor de retorno del método open se asigna a la variable f. Al salir del bloque de código with, el sistema llamará automáticamente al método f.close (). El efecto de with es el mismo que el de usar sentencias try / finalmente. Entonces, ¿cuál es su principio de realización? Antes de hablar del principio de con, necesitamos involucrar otro concepto, es decir, el administrador de contexto (Administrador de contexto).

Que es el contexto

El contexto significa diferentes significados en diferentes lugares y debe entenderse perceptivamente. De hecho, el contexto es sencillo y tiene el mismo significado que el contexto del artículo. De una manera más popular, creo que es mejor llamar al entorno. ...

Lin Chong gritó "¡Ah!" ...

Pregunta: ¿Qué tipo de corazón expresa "Ah Yeah" de Lin Chong?

Respuesta: ¡Ah, tu madre es alta!

Mira, un artículo, te doy un extracto. No puedes leerlo porque hay contexto, es decir, existe el entorno del lenguaje. Lo que dice un párrafo debe inferirse del contexto (el contexto del artículo).

La aplicación hace clic en un botón para ingresar a una nueva interfaz y también guardar la información sobre la pantalla a la que saltó, de modo que pueda retroceder correctamente cuando haga clic en Atrás. Si no la guarda, no podrá saltar hacia atrás correctamente.

Si observa estos ejemplos típicos de contexto, puede entenderlo como un entorno. (Aunque el contexto se llama contexto, el programa generalmente solo tiene lo anterior, pero se llama contexto. La interrupción del proceso tiene algunos problemas en el sistema operativo . Siguiente, pero no profundice en él si no hace esta pregunta avanzada ...)

Administrador de contexto

  • Cualquier objeto que implemente los métodos __ \ enter __ () y __exit __ () se puede llamar administrador de contexto, y los objetos del administrador de contexto pueden usar la palabra clave with. Obviamente, el objeto de archivo también implementa el administrador de contexto.

Entonces, ¿cómo implementa el objeto de archivo estos dos métodos? Podemos simular e implementar nuestra propia clase de archivo y dejar que esta clase implemente los métodos __enter __ () y __exit __ ().

class File():

    def __init__(self, filename, mode):
        self.filename = filename
        self.mode = mode

    def __enter__(self):
        print("entering")
        self.f = open(self.filename, self.mode)
        return self.f

    def __exit__(self, *args):
        print("will exit")
        self.f.close()

El método __enter __ () devuelve el objeto de recurso, aquí está el objeto de archivo que está a punto de abrir, y el método __exit __ () maneja algunos trabajos de limpieza.

Debido a que la clase File implementa el administrador de contexto, ahora puede usar la instrucción with.

with File('out.txt', 'w') as f:
    print("writing")
    f.write('hello, python')

De esta manera, no hay necesidad de llamar explícitamente al método close, y el sistema lo llamará automáticamente, incluso si se encuentra una excepción en el medio, se llamará al método close.

Otra forma de implementar un administrador de contexto

Python también proporciona un decorador de administrador de contexto, que simplifica aún más la implementación del administrador de contexto. La función se divide en dos partes por rendimiento, la instrucción antes de rendimiento se ejecuta en el método de entrada y la instrucción después de rendimiento se ejecuta en el método de salida . El valor inmediatamente después del rendimiento es el valor de retorno de la función.

from contextlib import contextmanager

@contextmanager
def my_open(path, mode):
    f = open(path, mode)
    yield f
    f.close()

调用
with my_open('out.txt', 'w') as f:
    f.write("hello , the simplest context manager")

para resumir

Python proporcionaLa sintaxis with se utiliza para simplificar las operaciones de limpieza posteriores de las operaciones de recursos. Es una alternativa a probar / finalmente. El principio de implementación se basa en el administrador de contexto.
Además, Python también proporciona un decorador de administrador de contexto para simplificar aún más la implementación de administradores superiores e inferiores.

Supongo que te gusta

Origin blog.csdn.net/weixin_42250835/article/details/89979408
Recomendado
Clasificación