如何在Python字典创建时忽略异常,实现多格式文件读取类映射
错误原因说明
- 最初在字典定义时直接实例化所有读取类:只要任意一个类初始化抛出异常,整个字典创建流程就会中断,即使你不会用到报错的键也无法继续运行。
- 手动调用
__init__的写法错误:Python 实例化类时类名(参数)的写法会自动执行实例创建+初始化逻辑,最终返回实例对象;而直接调用__init__仅做初始化操作,本身返回值为None,因此你拿到的resulting_frames是None,自然不存在上下文管理器要求的__enter__方法,抛出属性错误。
可行解决方案
方案1:提前扫描生成可用读取器字典
适合需要在UI侧提前禁用不可用格式选项的场景,会遍历所有支持的格式,仅把初始化成功的读取实例存入字典:
import framesource # 固定的格式名->读取类的映射,存类本身,不提前实例化 READER_CLS_MAPPING = { 'pngs': framesource.pngs, 'mat': framesource.mat, # 其他支持的格式按需补充 } # 从UI获取参数 filepath = 'some/path/to/data' source_type = 'pngs' # 生成当前路径下可用的读取器字典 available_readers = {} for fmt, reader_cls in READER_CLS_MAPPING.items(): try: # 正常实例化类,不要手动调用__init__ available_readers[fmt] = reader_cls(filepath) except FileNotFoundError: # 仅跳过文件不存在的格式,其他异常如权限问题可正常抛出排查 continue # 使用前判断是否存在对应格式 if source_type not in available_readers: # 这里可以加UI弹窗提示用户 raise ValueError(f"当前路径下不存在{source_type}格式的可读取数据") resulting_frames = available_readers[source_type] with resulting_frames as _frames: # 你的数据处理逻辑
方案2:懒加载模式(用户选择后再初始化)
如果不需要提前知道所有可用格式,仅在用户选择对应格式后再做初始化检查,性能更优:
import framesource READER_CLS_MAPPING = { 'pngs': framesource.pngs, 'mat': framesource.mat, # 其他支持的格式按需补充 } # 从UI获取参数 filepath = 'some/path/to/data' source_type = 'pngs' try: reader_cls = READER_CLS_MAPPING[source_type] resulting_frames = reader_cls(filepath) except KeyError: raise ValueError(f"不支持的格式类型:{source_type}") except FileNotFoundError: raise ValueError(f"当前路径下不存在{source_type}格式的数据") with resulting_frames as _frames: # 你的数据处理逻辑
内容的提问来源于stack exchange,提问作者Messypuddle
相关产品推荐
相关产品推荐

