¿Es esta la forma correcta de usar la declaración de python "con" en combinación con un bloque try-except ?:
try:
with open("file", "r") as f:
line = f.readline()
except IOError:
<whatever>
Si es así, entonces considerando la antigua forma de hacer las cosas:
try:
f = open("file", "r")
line = f.readline()
except IOError:
<whatever>
finally:
f.close()
¿El principal beneficio de la declaración "con" aquí es que podemos deshacernos de tres líneas de código? No me parece tan convincente para este caso de uso (aunque entiendo que la declaración "with" tiene otros usos).
EDITAR: ¿Es idéntica la funcionalidad de los dos bloques de código anteriores?
EDIT2: Las primeras respuestas hablan en general sobre los beneficios de usar "con", pero esos parecen tener un beneficio marginal aquí. 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 "con".
Respuestas:
finally
cláusula porquef
no está vinculada.El código de estilo antiguo equivalente sería:
Como puede ver, la
with
declaración 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 unawith
declaración. Por ejemplo:Además de eso, personalmente considero una mala costumbre detectar cualquier excepción lo antes posible. Este no es el propósito de las excepciones. Si la función 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 estastry...finally
declaraciones en niveles internos.fuente
Si el contenido del
finally
bloque está determinado por las propiedades del objeto de archivo que se está abriendo, ¿por qué no debería ser el implementador del objeto de archivo quien escriba elfinally
bloque? Ese es el beneficio de lawith
declaración, mucho más que ahorrarle tres líneas de código en esta instancia en particular.Y sí, la forma en que ha combinado
with
ytry-except
es prácticamente la única forma de hacerlo, ya que los errores excepcionales causados dentro de laopen
declaración en sí no se pueden detectar dentro delwith
bloque.fuente
Creo que te equivocaste con la declaración "con" de que solo reduce las líneas. Realmente realiza la inicialización y maneja el desmontaje.
En tu caso "con" hace
Aquí hay un enlace para entender la declaración "con": http://effbot.org/zone/python-with-statement.htm
Editar: 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 obtiene con él. como mencionaste sobre la pérdida accidental de f.close ().
fuente
La forma más Pythonic para los siguientes códigos es:
fuente
readline()
llamada que falta , su versión no cierra el archivo si elreadline()
resultado es unIOError
.