Usando la statement “with” de python con el bloque try-except

¿Es esta la forma correcta de usar la statement “con” de python en combinación con un bloque try-except ?:

try: with open("file", "r") as f: line = f.readline() except IOError:  

Si lo es, entonces considerando la vieja forma de hacer las cosas:

 try: f = open("file", "r") line = f.readline() except IOError:  finally: f.close() 

¿El beneficio principal de la statement “con” es que podemos eliminar tres líneas de código? No me parece tan convincente para este caso de uso (aunque entiendo que la statement “con” tiene otros usos).

EDITAR: ¿La funcionalidad de los dos bloques de código anteriores es idéntica?

EDIT2: Las primeras respuestas hablan generalmente sobre los beneficios de usar “con”, pero aquí parecen tener un beneficio marginal. Todos hemos estado (o deberíamos haber estado) llamando explícitamente a f.close () durante años. Supongo que un beneficio es que los codificadores descuidados se beneficiarán de usar “with”.

  1. Los dos bloques de código que has dado no son equivalentes.
  2. El código que describió como una forma antigua de hacer las cosas tiene un error grave: en caso de que la apertura del archivo falle, obtendrá una segunda excepción en la cláusula finally porque f no está vinculada.

El código de estilo antiguo equivalente sería:

 try: f = open("file", "r") try: line = f.readline() finally: f.close() except IOError:  

Como puede ver, la instrucción with puede hacer que las cosas sean menos propensas a errores. En las versiones más recientes de Python (2.7, 3.1), también puede combinar varias expresiones en una with una statement. Por ejemplo:

 with open("input", "r") as inp, open("output", "w") as out: out.write(inp.read()) 

Además de eso, personalmente considero que es un mal hábito capturar cualquier excepción lo antes posible. Este no es el propósito de las excepciones. Si la función de IO que puede fallar es parte de una operación más complicada, en la mayoría de los casos, el IOError debe abortar toda la operación y, por lo tanto, manejarse en un nivel externo. Usando with declaraciones, puede deshacerse de todas estas declaraciones de try...finally en niveles internos.

Si los contenidos del bloque finally están determinados por las propiedades del objeto de archivo que se está abriendo, ¿por qué el ejecutor del objeto de archivo no debería ser el encargado de escribir el bloque finally ? Ese es el beneficio de la statement with , mucho más que ahorrarle tres líneas de código en esta instancia en particular.

Y sí, la forma en que se ha combinado with try-except es prácticamente la única forma de hacerlo, ya que los errores excepcionales causados ​​dentro de la propia statement open no se pueden detectar dentro del bloque with .

Creo que te equivocaste con la afirmación “con” de que solo reduce las líneas. Realmente hace la inicialización y maneja el desassembly.

En tu caso “con” hace

  • abrir un archivo,
  • procesar su contenido, y
  • Asegúrate de cerrarla.

Aquí hay un enlace para entender la statement “con”: http://effbot.org/zone/python-with-statement.htm

Edición: Sí, su uso de “con” es correcto y la funcionalidad de ambos bloques de código es idéntica. Pregunta sobre por qué usar “con”? Es por los beneficios que obtienes con ello. como mencionaste sobre la falta accidental de f.close ().

La forma más pythonica de los siguientes códigos es:

 try: f = open("file", "r") try: line = f.readline() finally: f.close() except IOError:  try: f = open("file", "r") except IOError:  else: f.close()