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()
如您所见,here,contextmanager.__exit__
的定义为:
"退出运行时上下文和return一个布尔标志,指示是否有
应抑制发生的异常。 (...) 从此方法返回真值将导致 with 语句抑制异常 并立即继续执行该语句在 with 声明之后。否则异常会在此方法执行完毕后继续传播。执行此方法期间发生的异常将替换 with 语句主体中发生的任何异常。
传入的异常不应显式重新引发 - 相反,此方法应 return 一个假值以指示该方法已成功完成并且不想抑制引发的异常。这允许上下文管理代码轻松检测 __exit__()
方法是否实际失败。"
因此,如果您只 return False
,它在功能上将与根本没有显式 return 相同,并且它可能是多余的。如果您决定添加带有 return True
的案例以抑制异常,为了清楚起见,添加 return False
可能会有所帮助。
在 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()
如您所见,here,contextmanager.__exit__
的定义为:
"退出运行时上下文和return一个布尔标志,指示是否有 应抑制发生的异常。 (...) 从此方法返回真值将导致 with 语句抑制异常 并立即继续执行该语句在 with 声明之后。否则异常会在此方法执行完毕后继续传播。执行此方法期间发生的异常将替换 with 语句主体中发生的任何异常。
传入的异常不应显式重新引发 - 相反,此方法应 return 一个假值以指示该方法已成功完成并且不想抑制引发的异常。这允许上下文管理代码轻松检测 __exit__()
方法是否实际失败。"
因此,如果您只 return False
,它在功能上将与根本没有显式 return 相同,并且它可能是多余的。如果您决定添加带有 return True
的案例以抑制异常,为了清楚起见,添加 return False
可能会有所帮助。