Py学习  »  Python

什么是Python Buffin?

ark0n • 4 年前 • 714 次点击  

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

它接受所需的参数:

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

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

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

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

exc_类型

Python定义了 TracebackException 接受 exc_type 在中的构造函数中上下文使用的参数 issubclass 具有 SyntaxError ,由此推断 exc_类型 确实是某种 Exception ,其中 语法错误 继承自。

执行值

而且,在那方面 回溯异常 类是 exc_value 符合我们的论点 exc_val 它似乎有各种属性,比如 __cause__ , __context__ ,以及在 TracebackType 本身。这使我认为参数本身就是 回溯异常 .

不含结核病

Python定义了 walk_tb 使用的函数 exc_tb 作为参数(从 docs.python.org ),并且此对象似乎具有 tb_frame , tb_lineno ,和 tb_next 可以追溯到 回溯型 班级 typeshed 图书馆。

思想?

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/49466
 
714 次点击  
文章 [ 1 ]  |  最新文章 4 年前
wim
Reply   •   1 楼
wim    4 年前

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

一般来说

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

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

那么正确的注释应该如下所示:

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

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