代码之家  ›  专栏  ›  技术社区  ›  notacorn

什么是Python Buffin?

  •  1
  • notacorn  · 技术社区  · 6 年前

    类有一个可定义的函数 __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 图书馆。

    思想?

    1 回复  |  直到 6 年前
        1
  •  3
  •   wim    6 年前

    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(!)中,仍然可以将旧样式的类作为异常进行提升

    推荐文章