每次调用assert时,我都希望将一些信息记录到文件/数据库中。有没有办法在每次调用assert时覆盖断言或注册某种回调函数来执行此操作?
此致 沙拉德帕
答案 0 :(得分:1)
我认为这是不可能的。 assert
是Python中的语句(而不是函数),具有预定义的行为。它是一种语言元素,不能只是被修改。更改语言不能解决问题。问题必须使用语言提供的内容来解决
但是你可以做一件事。断言会在失败时引发AssertionError
异常。这可以被利用来完成工作。将assert statement
放在Try-expect
块中,然后在该块内进行回调。它并不像您正在寻找的那样好。每个断言都必须这样做。修改声明的行为是我们不会做的事情。
答案 1 :(得分:1)
尝试重载AssertionError
而不是assert
。原始断言错误在python2中的exceptions module和python3中的builtins模块中可用。
import exceptions
class AssertionError:
def __init__(self, *args, **kwargs):
print("Log me!")
raise exceptions.AssertionError
答案 2 :(得分:1)
有可能,因为pytest实际上在某些情况下重写了断言表达式。我不知道该怎么做或它有多容易,但这里是文档解释何时在pytest中发生断言重写: https://docs.pytest.org/en/latest/assert.html
默认情况下,如果Python版本大于或等于2.6,py.test将重写测试模块中的断言语句。
...
py.test在导入时重写测试模块。它通过使用一个 import hook写一个新的pyc文件。
理论上,您可以查看pytest代码以了解它们是如何做到的,也许可以做类似的事情。
有关进一步的信息,本杰明彼得森写了py.test的新断言重写幕后[http://pybites.blogspot.com/2011/07/behind-scenes-of-pytests-new-assertion.html]
答案 3 :(得分:0)
我建议使用pyhamcrest。它有非常美丽的匹配器,可以简单地重新实现。你也可以写自己的。