Tengo varios archivos posibles que podrían contener mis datos; se pueden comprimir de diferentes formas, así que para abrirlas necesito usar file()
, gzip.GzipFile()
y otras que también devuelvan un objeto de archivo (compatible con la interfaz with
).Varios `con`s en` try`s
quiero probar cada uno de ellos hasta que uno tiene éxito en la apertura, por lo que podría hacer algo como
try:
with gzip.GzipFile(fn + '.gz') as f:
result = process(f)
except (IOError, MaybeSomeGzipExceptions):
try:
with xCompressLib.xCompressFile(fn + '.x') as f:
result = process(f)
except (IOError, MaybeSomeXCompressExceptions):
try:
with file(fn) as f:
result = process(f)
except IOError:
result = "some default value"
lo que obviamente no es factible en caso de tener docenas de posibles variantes de compresión. (El anidamiento se hará más y más profundo, el código siempre se parece mucho).
¿Hay alguna forma más sencilla de deletrear esto?
EDITAR: Si es posible me gustaría tener el process(f)
fuera del intento/excepto también para evitar la captura accidental de excepciones planteadas en el process(f)
.
Creo que me gusta ese enfoque incluso más que el otro. – Alfe
Agradable. Me gusta especialmente el segundo enfoque. Sugeriría que ambos enfoques arrojen una excepción para UnknownCompressionFormat. –