Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python内置的退出参数类型是什么?_Python_Python 3.x_Exception_With Statement_Traceback - Fatal编程技术网

python内置的退出参数类型是什么?

python内置的退出参数类型是什么?,python,python-3.x,exception,with-statement,traceback,Python,Python 3.x,Exception,With Statement,Traceback,类有一个可定义的函数\uuuuu exit\uuuu,该函数允许实现上下文管理器 它接受所需的参数: def __exit__(self, exc_type, exc_val, exc_tb): 但我找不到关于这些论点是什么及其类型的明确定义 以下是我对它们是什么以及为什么的最佳猜测,但我不完全确定: def __exit__(self, exc_type: Exception, exc_val: TracebackException, exc_tb: TracebackType): exc

类有一个可定义的函数
\uuuuu exit\uuuu
,该函数允许实现上下文管理器

它接受所需的参数:

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_类型
参数,该参数在与
SyntaxError
的构造函数中上下文使用,从而推断
exc_类型
确实是某种
异常
,它继承自

exc_val 另外,在
TracebackException
类中有一个
exc_值
参数,它与
exc_val
匹配,它似乎具有各种属性,如
原因
上下文
,以及所有在
TracebackType
本身中定义的其他属性。这使我认为该参数本身就是
TracebackException
的一个实例

exc_tb Python定义了一个使用
exc\u tb
作为参数(手动跟踪)的函数,该对象似乎具有
tb\u frame
tb\u lineno
tb\u next
属性,这些属性可以追溯到库中的
TracebackType


想法?

exc_类型
是异常的类<代码>exc_val是异常实例
exc_tb
是一个回溯对象,其中有一个引用

一般来说,情况应该是

  • 类型(exc_val)是exc_类型
  • exc\u val.\uu回溯是exc\u tb
请注意,当上下文管理器下的代码未引发异常时,
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

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

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

您可能想知道为什么这个API有三个参数,而其中两个参数可以从异常实例本身轻松确定。但情况并非总是这样,在较旧版本的Python中,可以将字符串作为异常引发,而异常的
\uuuu traceback\uuu
属性不存在。您仍然可以在Python 2.7(!)中将旧式类作为例外提出。

从何处导入TrackbackType?@Mentos1386从
类型
模块导入,不要与
类型
模块混淆。exit的返回类型注释是否应该是
可选[bool]
@Laurenz typeshed使用bool,我想返回None而不是False并没有实际区别,但它只是因为duck类型而起作用。