更灵活的警告模块。

warn的Python项目详细描述


警告

更好的警告。

请参阅完整的documentation

python标准warning module非常 很好,而且我认为没有充分利用;尽管它错过了一些功能; 特别是它只允许对触发/调用的代码进行过滤 不推荐使用的函数,但无法根据 发出警告的模块。

这是试图解决这个问题。

太长时间没有阅读:

显式优于隐式:

from warn import patch
patch()

# use the warning module as usual

尽管warnings.filterwarning函数现在已经获得了 emodule由发出 警告;示例:

import warnings
warnings.filter('default', category=DeprecationWarnings, emodule='matplotlib\.pyplot.*')

来自matplotlib.pyplot及其子模块的所有警告现在都是 默认显示,无论是否直接触发,通过 熊猫,海伯恩,你自己的代码…

警告发射器,警告呼叫者。

python警告是一段相对简单的代码,它是 一旦你学会了如何使用它,你的右手就非常强大。

它允许你确定你是否想要一个特殊的 触发异常、向用户显示消息或 什么都不做。

用一件简单的作品很难显示出战争的全部力量 但在大型代码库中,一旦开始有多个层 依赖性的一种简洁的警告用法,特别是 DeprecationWarning可以产生很大的影响。

呼叫者,vs发射器

让我们先弄清楚一些词汇,以区分警告 来自警告“发射器”的“呼叫者”

# file emitter.pydefpublic_api(param1,deprecated_parameter=None)::ifdeprecated_parameter:return_deprecated_function(param1,deprecated_parameter):else:returnnormal_buisnell_logic(param1)def_deprecated_function(param1,deprecated_parameter):importwarningsA# warning emitted herewarnings.warn('using `deprecated_parameter` is deprecated ',DeprecationWarning,stacklevel=3)
# file caller.pyfromemitterimportpublic_apipublic_api(1,True)# warning triggered here.

现在您可以执行类似于

fromwarnimportpathpatch()importwarningswarnings.filter('default',category=DeprecationWarnings,emodule='emitter.*')importemitteremitter.bar()# will log the warning !

在测试套件中将此项更改为“error”,并按 依赖关系!

python内置模块允许您按调用方筛选警告 (假设发射器正确设置了stacklevel选项,则 并不总是显而易见的)。当你 开发呼叫者;但在开发 发射器。

调用者通常有许多底层库 可以触发警告,或者开发人员只关心 发射器警告。

许多库通过子分类来绕过这个限制。 警告;两个例子是 Matplolibsympy 以便有选择地使他们成为可能。不过,这只是一种粗俗的方式 过滤警告,它需要知道警告在哪里 为导入和筛选而定义。

因为python默认选择过滤掉不推荐警告, 这还强制继承UserWarning(matplotlib的选择), 它删除了 或在上的警告筛选器模块中插入自定义筛选器 导入(选择同情),这会导致令人惊讶的行为。

python 2上的可用性

我不知道在python 2上是否有效;我真的没有时间 调查;我不太在意;但可以随时发送公关 如果有必要的话,我很乐意合并它。

限制

对于以下情况之一的软件包,此操作不起作用:

  • patch()have之前获取并保留对warnings.warnhave的引用 被称为;也就是说形式上的东西: from warnings iport warn
  • 无法在C扩展上工作(aka不会在numpy上筛选);这两个 以上是技术上可行的组装修补,我是 不舒服。

丑陋的

因为警告过滤器必须是5个特定类型的元组 通过在过滤器列表中推送虚拟实例并将其用作键 用于代理查找实际筛选器键。所以更糟的情况是 你在这个模块中插入的过滤器将是no-op,但是你将 如果您使用它,将导致性能损失,特别是如果您的代码基 引发了很多警告。

得到上游

我会love反馈,并有一个更好的api来处理 cpython级别以提供自定义筛选器和自定义筛选器 功能。

间隔

良好的折旧警告。

一个好的警告,特别是贬损警告是非常 有帮助,并且可以对api的采用产生影响。拿着 以下是虚构的例子:

>>>importwarnings>>>warnings.simplefilter('default')>>>fromquezetrasteimportfrobulate,constribule>>>frobulate('HI',3)DeprecationWarning:The'frobulate'functionisdeprecated.>>>contribule('Hi',3)DeprecationWarning:The'constribule(message, recipient_id)'functionofthe'quezetraste'packageisdeprecatedsinceversion7.3.Ithazbeenreplacedby'Recipient(id).send(message)'whichwasavailablesince7.2.Seehttp://url.to/documentation/#1337

在测试套件中将deprecationwarnings转换为error!

至少使它们可见;最多在您修复了一个弃用警告之后 将this specific one转换为错误以不复制它。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
SpringBoot如何在Java中创建固定长度的平面文件?   java是freemarker类型。果心无法解决此问题。它是从required间接引用的。类文件   设置字符串格式时发生java FormatFlagsTransversionMismatchException异常   无法将java应用程序连接到sql server 2008 R2   在关闭事件之前,使用Java API BMC补救方法更新“分类”   java如何在使用opencsv写入csv时保持空值   java在spring中是否需要事务属性?   java Hibernate抑制信息消息   java如何在spring data cosmos的@Container中给出布尔值?   java获取旋转矩形的角   如何在java中获得对象的两个数组列表的差异   java与新接口相比,嵌套模板的优点和缺点是什么?   Java Apache Derby十进制列数据为0.001输出为0.0   用于隐藏包含特定单词的元素的javascript用户脚本   java Jackson objectMapper无法读取UTF8   java在JavaFX中创建太多事件处理程序   如何在运行Redhat Linux的amazon ec2微实例上卸载openjdk   如何使用Java swing创建一个动态列表,其中必须为每个元素指定多个参数   java如何在将面板放置在gridlayout上时消除面板之间的间隙?   java标准方法名称,为什么println中的l不是大写?