更灵活的警告模块。
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选项,则 并不总是显而易见的)。当你 开发呼叫者;但在开发 发射器。
调用者通常有许多底层库 可以触发警告,或者开发人员只关心 发射器警告。
许多库通过子分类来绕过这个限制。 警告;两个例子是 Matplolib 和 sympy 以便有选择地使他们成为可能。不过,这只是一种粗俗的方式 过滤警告,它需要知道警告在哪里 为导入和筛选而定义。
因为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转换为错误以不复制它。