Possiedo diversi file che potrebbero contenere i miei dati; possono essere compressi in diversi modi, quindi per aprirli ho bisogno di usare file()
, gzip.GzipFile()
e altri che restituiscono anche un oggetto file (che supporta l'interfaccia with
).Diversi `with`s in` try`s
voglio provare ciascuno di loro fino a quando si riesce ad apertura, così ho potuto fare qualcosa di simile
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"
che ovviamente non è fattibile nel caso in cui ho decine di possibili varianti di compressione. (Il nesting diventerà sempre più profondo, il codice sembra sempre molto simile.)
C'è un modo più bello per spiegarlo?
MODIFICA: Se possibile mi piacerebbe avere il process(f)
fuori dal tentativo/eccetto anche per evitare l'accidentale cattura di eccezioni sollevate nello process(f)
.
Penso che questo approccio mi piaccia ancor più dell'altra. – Alfe
Bello. Mi piace particolarmente il secondo approccio. Suggerirei comunque che entrambi gli approcci generassero un'eccezione per UnknownCompressionFormat. –