У меня есть несколько возможных файлов, которые могут содержать мои данные; они могут быть сжаты по-разному, поэтому для их открытия мне нужно использовать file()
, gzip.GzipFile()
и другие, которые также возвращают объект файла (поддерживающий интерфейс with
).
Я хочу попробовать каждый из них, пока вам не удастся открыть его, поэтому я мог бы сделать что-то вроде
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"
что, очевидно, не представляется возможным в случае, если у меня есть десятки возможных вариантов сжатия. (Гнездо будет становиться все глубже и глубже, код всегда выглядит очень похожим.)
Есть ли лучший способ написать это?
EDIT: если возможно, я хотел бы иметь process(f)
из try/except, кроме того, чтобы избежать случайного захвата исключений, поднятых в process(f)
.