Python上下文管理器__init__方法中的错误处理方案咨询
行星数据计算包的上下文管理器优化问题
背景与现有实现
我正在使用一个依赖文件存储信息来计算行星相关数据(如速度、位置)的包,该包仅提供load和unload方法,基础用法如下:
load(["File_1", "File_2"]) try: function() finally: unload(["File_1", "File_2"])
这显然是上下文管理器的典型应用场景,但该包并未提供相关实现,因此我自行编写了一个上下文管理器类:
class file_manager: def __init__(self, file_list) -> None: self.file_list = file_list load(self.file_list) return None def __enter__(self) -> None: return None def __exit__(self, exc_type, exc_value, traceback) -> None: unload(self.file_list) return None
使用该上下文管理器后,代码可简化为:
with file_manager(["File_1", "File_2"]): function()
其中__exit__方法能保证即使function执行报错,文件仍会被正常卸载。
遇到的问题
load函数采用逐个加载文件的逻辑,且不会预先检查文件是否存在。如果File_1存在但File_2不存在,File_1会被成功加载,但加载File_2时会抛出异常。根据Python文档规则,仅当__enter__方法无错误返回时,__exit__才会被调用,因此此时已加载的File_1无法被卸载。
尝试方案与疑问
我尝试在__init__方法中用try...except处理异常:
def __init__(self, file_list) -> None: self.file_list = file_list try: load(self.file_list) except FileDoesNotExistError: self.__exit__(FileDoesNotExistError, False, None)
但不确定这是否是正确的解决方案,比如在Cython中类的__dealloc__方法可以保证无论是否发生异常都会执行,Python中有没有更稳妥的处理方式?
内容的提问来源于stack exchange,提问作者alfonsoSR
相关产品推荐
相关产品推荐

