¿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”.
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
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()