当前位置: 首页 > 面试题库 >

Python“提高”用法

温嘉赐
2023-03-14
问题内容

raiseraise fromPython和有什么不一样?

try:
    raise ValueError
except Exception as e:
    raise IndexError

产生

Traceback (most recent call last):
  File "tmp.py", line 2, in <module>
    raise ValueError
ValueError

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "tmp.py", line 4, in <module>
    raise IndexError
IndexError

try:
    raise ValueError
except Exception as e:
    raise IndexError from e

产生

Traceback (most recent call last):
  File "tmp.py", line 2, in <module>
    raise ValueError
ValueError

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "tmp.py", line 4, in <module>
    raise IndexError from e
IndexError

问题答案:

区别在于,当您使用时from,将设置 __cause__ 属性,并且消息将指出异常是 由引起的
。如果您省略,from__cause__设置no ,但也可以设置该 __context__ 属性,然后回溯显示上下文,就像
处理其他事件时一样

__context__如果raise在异常处理程序中使用过,则设置发生的情况;如果您raise在其他任何地方使用过,则也不会__context__设置。

如果__cause__设置了a,那么__suppress_context__ = True还会在异常上设置一个标志;当__suppress_context__设置为时,在打印回溯时True__context__忽略。

从异常处理程序,你养的时候 希望显示上下文(不想 处理另一个异常发生时 ,然后用消息)raise ... from None来设置__suppress_context__True

换句话说,Python在异常上设置了一个 上下文 ,因此您可以自省引发异常的位置,让您查看是否用它替换了另一个异常。您还可以将 原因
添加到异常中,使回溯明确地显示另一个异常(使用不同的措辞),并且上下文将被忽略(但在调试时仍可以自省)。使用raise ... from None使您可以禁止打印上下文。

请参阅raise语句documenation:

from子句用于异常链接:如果给出,则第二个 表达式
必须是另一个异常类或实例,然后将其附加到引发的异常作为__cause__属性(可写)。如果未处理引发的异常,则将打印两个异常:

>>> try:
...     print(1 / 0)
... except Exception as exc:
...     raise RuntimeError("Something bad happened") from exc
...
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
ZeroDivisionError: int division or modulo by zero

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "<stdin>", line 4, in <module>
RuntimeError: Something bad happened

如果在异常处理程序或finally子句中引发异常,则类似的机制会隐式工作:然后,将先前的异常附加为新异常的__context__属性:

>>> try:
...     print(1 / 0)
... except:
...     raise RuntimeError("Something bad happened")
...
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
ZeroDivisionError: int division or modulo by zero

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "<stdin>", line 4, in <module>
RuntimeError: Something bad happened

另请参阅内置异常文档,以获取有关上下文的详细信息,并在异常中附加原因信息。



 类似资料:
  • 本文向大家介绍利用ctypes提高Python的执行速度,包括了利用ctypes提高Python的执行速度的使用技巧和注意事项,需要的朋友参考一下 前言 ctypes是Python的外部函数库。它提供了C兼容的数据类型,并且允许调用动态链接库/共享库中的函数。它可以将这些库包装起来给Python使用。这个引入C语言的接口可以帮助我们做很多事情,比如需要调用C代码的来提高性能的一些小型问题。通过它你

  • 问题内容: Python中最快的FFT实现是什么? 似乎numpy.fft和scipy.fftpack都基于fftpack,而不是FFTW。fftpack和FFTW一样快吗?使用多线程FFT或使用分布式(MPI)FFT怎么办? 问题答案: 当然,您可以使用Cython或其他具有类似想法的工具(可以访问外部库)包装要测试的任何FFT实现。 基于GPU 如果要测试FFT实现,则还可以查看基于GPU的代

  • 本文向大家介绍python中提高pip install速度,包括了python中提高pip install速度的使用技巧和注意事项,需要的朋友参考一下 pip install命令默认是用的是python官方源,由于一些客观原因,连接速度很慢,甚至超时中断,到时很多模块安装不上,甚是苦恼! 怎么办? 使用国内镜像源,将以下命令完成拷贝出来,粘贴至记事本中,保存为bat文件,双击执行该批处理文件。 然

  • Webstorm拥有非常强大的自动提示功能,但 javascript 太灵活了,又是弱类型语言,提示的准确度和详细度依然是个问题(比如,一个带参数的函数,Webstorm无法提示出参数的数据类型)。 Webstorm5.0 引入JSdoc的标签支持,通过开发者自己给代码加上符合jsdoc要求的注释,来达到强化js自动提示的目标。 随便写个类,没加任何jsdoc注释时: function User(

  • 本文向大家介绍盘点提高 Python 代码效率的方法,包括了盘点提高 Python 代码效率的方法的使用技巧和注意事项,需要的朋友参考一下 第一招:蛇打七寸:定位瓶颈 首先,第一步是定位瓶颈。举个简单的栗子,一个函数可以从1秒优化到到0.9秒,另一个函数可以从1分钟优化到30秒,如果要花的代价相同,而且时间限制只能搞定一个,搞哪个?根据短板原理,当然选第二个啦。 一个有经验的程序员在这里一定会迟疑