Python、__exit__ 方法是否应该使用 return False 或根本不使用 return

Python, __exit__ method should it use return False or no return at all

在 return 计算值时,首选方法是什么?为什么使用 __exit__ 方法? 我应该写 return False 还是根本不写 return,因为那样会 return None,我认为这两种情况下的行为是相同的,但从我看到的人们写的情况来看在这两个方面,我不明白为什么。

class File:
    def __init__(self, file_name: str, method: str) -> None:
        self.file_obj = open(file_name, method)
        
    def __enter__(self) -> File:
        return self.file_obj

    def __exit__(self, exctype: Optional[Type[BaseException]], excinst: Optional[BaseException], exctb: Optional[TracebackType]) -> bool:
        self.file_obj.close()
        return False

class File:
    def __init__(self, file_name: str, method: str) -> None:
        self.file_obj = open(file_name, method)
        
    def __enter__(self) -> File:
        return self.file_obj

    def __exit__(self, exctype: Optional[Type[BaseException]], excinst: Optional[BaseException], exctb: Optional[TracebackType]) -> None:
        self.file_obj.close()

如您所见,herecontextmanager.__exit__ 的定义为:

"退出运行时上下文和return一个布尔标志,指示是否有 应抑制发生的异常。 (...) 从此方法返回真值将导致 with 语句抑制异常 并立即继续执行该语句在 with 声明之后。否则异常会在此方法执行完毕后继续传播。执行此方法期间发生的异常将替换 with 语句主体中发生的任何异常。

传入的异常不应显式重新引发 - 相反,此方法应 return 一个假值以指示该方法已成功完成并且不想抑制引发的异常。这允许上下文管理代码轻松检测 __exit__() 方法是否实际失败。"

因此,如果您只 return False,它在功能上将与根本没有显式 return 相同,并且它可能是多余的。如果您决定添加带有 return True 的案例以抑制异常,为了清楚起见,添加 return False 可能会有所帮助。