notas de Python: con y administrador de contexto

La declaración with es una sintaxis simplificada proporcionada por Pyhton. Es adecuada para acceder a recursos. Garantiza que se realicen las operaciones de "limpieza" necesarias y se liberen los recursos independientemente de si se produce una excepción durante el uso. La declaración with se utiliza principalmente para simplificar el código operaciones.

administrador de contexto

  • Contexto es la traducción literal de contexto, que se utiliza en programas para representar el entorno circundante durante la ejecución del código.
  • Cualquier objeto que implemente __enter__() y __exit__() es un administrador de contexto.
  • Arriba: operaciones antes de la ejecución normal del código; Abajo: operaciones después de la ejecución normal del código, como excepciones o finalizar/cerrar código
  • El administrador de contexto puede usar la palabra clave with para garantizar que el archivo se pueda cerrar, lo cual es una alternativa a try/finally
class Foo(object):

    def __init__(self):
        print('实例化一个对象')

    def __enter__(self):
        print('进入')

    def __exit__(self, exc_type, exc_val, exc_tb):
        print('退出')

obj = Foo()

with obj:
    print('正在执行')

Instanciar un objeto
Entrar
Ejecutando
Salir

Porque cuando definimos Foo, definimos los métodos __enter__ y __exit__, entonces el objeto obj que instanciamos es un administrador de contexto.

con administrador de contexto:
 cuerpo de declaración

Cuando with encuentra un administrador de contexto, ejecutará el método __enter__ del administrador de contexto antes de ejecutar el cuerpo de la declaración. Generalmente se usa para procesar el contenido previo a la operación, como la creación de objetos, la inicialización, etc., y luego ejecutar el cuerpo de la declaración. Después Al ejecutar el cuerpo de la declaración, finalmente se ejecuta el método __exit__, que generalmente se usa para manejar algunos trabajos finales, como cerrar archivos, cerrar bases de datos, etc. El proceso general es el siguiente:

  1. Llame al método de entrada para realizar operaciones de preprocesamiento
    2. Realice operaciones de usuario
    3. Llame al método de salida para completar la operación de limpieza

2. Al llamar al método __enter__ () del administrador de contexto, si se usa la cláusula as, el valor de retorno del método __enter__() se asigna al destino en la cláusula as.

con el administrador de contexto como objetivo:
cuerpo de declaración de código

class Foo(object):

    def __init__(self):
        print('实例化一个对象')

    def __enter__(self):
        print('进入')
        # return self

    def __exit__(self, exc_type, exc_val, exc_tb):
        print('退出')

with Foo() as obj:
    print(obj,type(obj))
    print('正在执行')

Insertar descripción de la imagen aquí
Descomente la línea de código que comentamos en el código anterior. El resultado es el siguiente: with
Insertar descripción de la imagen aquí
debe ir seguido de un administrador de contexto. Si se usa as, el valor de retorno del método enter () del administrador de contexto se asigna al target.El objetivo puede ser una sola variable o una tupla encerrada por "()" (no puede ser una lista de variables separadas solo por ",", se debe agregar "()")

con y manejo de excepciones

with语句类似以下功能
  try :
		语句体
  except:
		exit()
  finally:
  	其它

La declaración with pasará el tipo de excepción, el valor y el rastreo al método __exit__, permitiendo que el método __exit__ maneje la excepción. Cuando se produce una excepción, si la salida devuelve False (el valor predeterminado es False cuando no se escribe el valor de retorno), la excepción se volverá a generar y la lógica de la declaración distinta de with manejará la excepción. Esta también es una práctica común; if devuelve Verdadero, se ignora la Excepción, la excepción ya no se manejará y el código posterior continuará ejecutándose.

class Foo(object):

    def __init__(self):
        print('实例化一个对象')

    def __enter__(self):
        print('进入')

    def __exit__(self, exc_type, exc_val, exc_tb):
        print('退出')
     # return True

obj = Foo()

with obj:
    raise ImportError
    print('正在执行')

El resultado es el siguiente:
Insertar descripción de la imagen aquí
Descomente la línea de código que comentamos en el código anterior, el resultado es el siguiente:
Insertar descripción de la imagen aquí

Una forma común de leer archivos:

con open("/tmp/foo.txt") como archivo:
datos = file.read()

  1. Al ejecutar la instrucción with, primero se ejecuta el código abierto que sigue a la instrucción with.
  2. Después de ejecutar el código, el resultado del código se guardará en f como [valor de retorno del método de entrada]
  3. Luego implemente la operación real a continuación
  4. Después de la operación, no es necesario escribir la operación de cierre del archivo, el archivo se cerrará automáticamente después de su uso [ejecución del método de salida]

Aquí se utiliza la instrucción with. Independientemente de si se produce una excepción durante el procesamiento del archivo, se garantiza que el identificador del archivo abierto se haya cerrado después de ejecutar la instrucción with . Si usa el paradigma tradicional try/finally, usaría un código similar al siguiente:

somefile = open(r'somefileName')
try:
    for line in somefile:
        print line
        # ...more code
finally:
    somefile.close()

En comparación, usar la instrucción with puede reducir la cantidad de codificación.

otro:

with solo se puede utilizar con administradores de contexto. Los administradores de contexto comunes incluyen

archivo
decimal.Subproceso
de contexto.Subproceso
LockType.Subproceso
de bloqueo.Subproceso
RLock.Subproceso
de condición.Subproceso
de semáforo.BoundedSemaphore

Enlaces de referencia:
1.https://www.cnblogs.com/huchong/p/8268765.html

Supongo que te gusta

Origin blog.csdn.net/qq_44804542/article/details/115980557
Recomendado
Clasificación