跳转到主要内容

重写函数字节码以支持断言内省。

项目描述

也许我会成为这个相当抽象的Python模块的唯一用户。但这个功能似乎值得从我的个人Python测试框架中分离出来,那里它被隐藏了。

这个 assert_rewriter 包使用快速高效的正则表达式来重写Python断言语句的字节码,以便在失败时打印出失败的比较——这是一个称为“断言内省”的功能,通常通过使用慢速和笨重的抽象语法树深度优先搜索来实现。它支持Python 2.7至3.12。

Python 3没有将断言内省钩子作为语言完全支持的一部分添加进来是一个巨大的损失。这会比他们做的其他任何改变更有用。(Python 3能做的唯一更有用的事情可能是消除那个可怕的 if __name__ == '__main__':,这在语言级别上完全是胡说八道,并且极大地困扰了所有我试图教授这个语言的学生。但是,唉,他们错过了这个机会。)

下面是一个没有断言内省会发生什么的例子。你编写一个测试

>>> def test_function():
...     assert 1 + 1 == 3

但是当它失败时,你得到零有用的信息

>>> test_function()
Traceback (most recent call last):
  ...
AssertionError

这个包旨在解决这个问题。将你的测试函数传递给 rewrite_function()。它将就地重写它们的字节码。然后函数将通过易于阅读的断言异常报告失败,解释出了什么问题

>>> from assert_rewriter import rewrite_function
>>> rewrite_function(test_function)
>>> test_function()
Traceback (most recent call last):
...
AssertionError: 2 != 3

默认情况下,重写的函数将调用 unittest.TestCase 方法而不是相应的断言。在上面的例子中,调用了 TestCase.assertEqual() 方法,并传入了 == 符号两边的值。如果您想提供自己的可调用对象,则将其放入一个与 assert_rewriter.core.comparison_constants 元组中列出的操作相同长度的元组中,然后将您的元组作为第二个参数传递给 rewrite_function()

我的测试框架仅在测试失败后进行断言重写,以节省在测试通常通过的情况下所需的时间;但这存在风险,即测试第二次执行时行为可能不同,因此其他人可能希望在事先重写测试。

无论如何,这可能永远会被默默地忽略,这本来也无可厚非,但在这里提供它,以防您需要它——或者至少对它的工作原理感到好奇,并认为通过快速阅读可能学到一些东西。

以下是GitHub存储库,用于报告与该包相关的问题

https://github.com/brandon-rhodes/assert_rewriter/

—— Brandon Rhodes

项目详情


下载文件

下载适用于您平台的应用程序。如果您不确定选择哪个,请了解更多关于 安装包 的信息。

源代码发行版

assert_rewriter-1.0.tar.gz (7.6 kB 查看散列)

上传时间 源代码

构建发行版

assert_rewriter-1.0-py3-none-any.whl (9.6 kB 查看散列)

上传时间 Python 3

支持者

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误记录 StatusPage StatusPage 状态页面