社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

什么是Python Buffin?

ark0n • 5 年前 • 1534 次点击  

类有一个可定义的函数 __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
 
1534 次点击  
文章 [ 1 ]  |  最新文章 5 年前
wim
Reply   •   1 楼
wim    5 年前

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