gpt4 book ai didi

python - python 内置的 __exit__ 参数类型是什么?

转载 作者:太空宇宙 更新时间:2023-11-03 23:52:41 26 4
gpt4 key购买 nike

类有一个可定义的函数__exit__,允许实现上下文管理器。

它接受必需的参数:

def __exit__(self, exc_type, exc_val, exc_tb):

但我找不到关于这些参数是什么及其类型的明确定义。

这是我对它们是什么以及为什么的最佳猜测,但我并不完全确定:

def __exit__(self, exc_type: Exception, exc_val: TracebackException, exc_tb: TracebackType):

exc_type

Python 定义了一个 TracebackException 类,它接受一个 exc_type 参数,该参数在 issubclass 的构造函数中根据上下文使用。与 SyntaxError,它推断 exc_type 确实是某种 ExceptionSyntaxError 继承自它。

exc_val

此外,在那个 TracebackException 类中是一个 exc_value 参数,它与我们的 exc_val 相匹配,它似乎具有各种属性,例如 __cause____context__ 和其他所有在 TracebackType 本身中定义的属性。这让我觉得参数本身就是 TracebackException 的一个实例。

exc_tb

Python 定义了一个 walk_tb使用 exc_tb 作为参数的函数(从 docs.python.org 手动追踪),并且此对象似乎具有 tb_frametb_linenotb_next 属性,可以追溯到 typeshed 中的 TracebackType 类图书馆。

想法?

最佳答案

exc_type 是异常的类。 exc_val 是异常实例。 exc_tb 是一个回溯对象,在types.TracebackType中有引用.

一般情况下应该是这样的

  • type(exc_val) 是 exc_type
  • exc_val.__traceback__ 是 exc_tb

请注意,当上下文管理器下的代码没有引发异常时,仍会调用 __exit__,并且 args 将为 (None, None, None) 所以所有三个参数都应注释为可选

那么它的正确注解应该是这样的:

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

您可能想知道为什么这个 API 有三个参数,而其中两个参数可以从异常实例本身轻松确定。但它并不总是这样,在旧版本的 Python 中,您可以将字符串作为异常引发,并且异常的 __traceback__ 属性不存在 until Python 2.5 .而且您仍然可以在 Python 2.7 (!) 中将旧式类作为异常引发

关于python - python 内置的 __exit__ 参数类型是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58808055/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com