con uso en python

Prefacio

La instrucción with es adecuada para acceder a los recursos, lo que garantiza que las operaciones de "limpieza" necesarias se realicen independientemente de si se produce una excepción durante el uso y se liberan los recursos.

Por ejemplo, el archivo se cierra automáticamente después de su uso / el bloqueo se adquiere y libera automáticamente en el hilo.

Preguntas que conducen

El siguiente código:

file = open("1.txt")
data = file.read()
file.close()

Hay dos problemas con el código anterior:
(1) La lectura del archivo es anormal, pero no se realiza ningún procesamiento;
(2) Es posible que olvide cerrar el identificador del archivo;

Mejorar

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
try:
    f = open('xxx')
except:
    print('fail to open')
    exit(-1)
try:
    do something
except:
    do something
finally:
    f.close()

Aunque este código funciona bien, es detallado.
El uso de with puede reducir la verbosidad y manejar automáticamente las excepciones generadas por el contexto. Como el siguiente código:

with open("1.txt") as file:
    data = file.read()

con principio de obras

(1) Después de evaluar la declaración que sigue a, se llama al método "–enter– ()" del objeto devuelto, y el valor de retorno de este método se asignará a la variable que sigue a;
(2) Cuando el código detrás de con Una vez ejecutados todos los bloques, se llamará al método "–exit– ()" del objeto devuelto anteriormente.
Ejemplo de código con principio de funcionamiento:

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
class Sample:
    def __enter__(self):
        print "in __enter__"
        return "Foo"
    def __exit__(self, exc_type, exc_val, exc_tb):
        print "in __exit__"
def get_sample():
    return Sample()
with get_sample() as sample:
    print "Sample: ", sample

Los resultados de ejecución del código son los siguientes:

in __enter__
Sample:  Foo
in __exit__

Se puede ver que todo el proceso en ejecución es el siguiente:
(1) se ejecuta el método enter ();
(2) el valor de retorno del método enter (), en este ejemplo es "Foo", asignado a la variable sample;
(3) se ejecuta el bloque de código , Imprime el valor de la variable de muestra como "Foo";
(4) Se llama al método exit ();

[Nota:] Hay 3 parámetros en el método exit (), exc_type, exc_val y exc_tb. Estos parámetros son bastante útiles en el manejo de excepciones.

  • exc_type: tipo incorrecto
  • exc_val: el valor correspondiente al tipo de error
  • exc_tb: donde ocurrió el error en el código

Código de muestra:

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
class Sample():
    def __enter__(self):
        print('in enter')
        return self
    def __exit__(self, exc_type, exc_val, exc_tb):
        print "type: ", exc_type
        print "val: ", exc_val
        print "tb: ", exc_tb
    def do_something(self):
        bar = 1 / 0
        return bar + 10
with Sample() as sample:
    sample.do_something()

Salida del programa:

in enter
Traceback (most recent call last):
type:  <type 'exceptions.ZeroDivisionError'>
val:  integer division or modulo by zero
  File "/home/user/cltdevelop/Code/TF_Practice_2017_06_06/with_test.py", line 36, in <module>
tb:  <traceback object at 0x7f9e13fc6050>
    sample.do_something()
  File "/home/user/cltdevelop/Code/TF_Practice_2017_06_06/with_test.py", line 32, in do_something
    bar = 1 / 0
ZeroDivisionError: integer division or modulo by zero

Process finished with exit code 1

para resumir

De hecho, cuando se lanza una excepción en el bloque de código que sigue a, se ejecuta el método exit (). Al desarrollar la biblioteca, las operaciones como la limpieza de recursos y el cierre de archivos se pueden colocar en el método exit ().
En resumen, la expresión with-as simplifica enormemente el trabajo de escribir finalmente cada vez, lo que es de gran ayuda para la elegancia del código.
Si hay varios elementos, puede escribir:

With open('1.txt') as f1, open('2.txt') as  f2:
    do something

Supongo que te gusta

Origin blog.csdn.net/sinat_38682860/article/details/108489882
Recomendado
Clasificación