我理解
__enter__
和__exit__
用于实现上下文管理器。
如果with
语句中发生异常,则将异常的类型,值和回溯传递给__exit__
方法。
__exit__
可以处理异常:
True
:正常处理异常。with
语句引发异常 我遇到了以下__exit__
方法。 return语句是多余的吗?
def __exit__(self, type, value, traceback):
self.close()
return type == None
因为在我看来,
type
自然会None
,因此__exit__
会返回true。什么都没有提出来。type
将设置为实际的异常类型,因此__exit__
返回false。异常是按原样引发的。答案 0 :(得分:13)
是的,该退货声明是多余的。仅当type
不 None
时,返回值才有意义。
来自object.__exit__()
documentation:
如果提供了异常,并且该方法希望抑制异常(即,防止它被传播),则它应该返回一个真值。否则,异常将在退出此方法时正常处理。
请注意, true value 会抑制异常;因此1
或"Handled!"
也可以,而不只是True
。
删除return
行将导致返回None
,并且功能将保持不变。然而,可读性会得到改善,因为return type == None
语句只会在多个级别上混淆(例如,为什么不使用type is None
?)。