首页 > 解决方案 > pytest.approx 如何实现它的魔力?

问题描述

pytestapprox函数看起来真的很酷,正如他们在文档中所说,它使用了一种非常直观的语法:

>>> from pytest import approx
>>> 0.1 + 0.2 == approx(0.3)
True
>>> 1 + 1e-8 == approx(1)
True

但这实际上是如何工作的?在第一个示例中,假设左侧简化为0.29999...,那么我如何才能在右侧有一些评估为等于它的东西呢?该函数是否approx知道如何查看==运算符的左值?实际有效的事实approx似乎是纯粹的巫术,有人可以解释它是如何完成它的巧妙小把戏的吗?

标签: pythonpytest

解决方案


这是一个标准数据模型挂钩到自定义__eq__.

下面的简化示例应该为您阐明“巫术”。

>>> class MyObj: 
...     def __eq__(self, other): 
...         print(self, "is being compared with", other) 
...         return "potato" 
...
>>> obj = MyObj()   
>>> 0.1 + 0.2 == obj
<__main__.MyObj object at 0xcafef00d> is being compared with 0.30000000000000004
'potato'

请注意,这float.__eq__将首次尝试处理此比较。上面显示的行为以及对于 的行为,关键依赖于已明确“选择退出”与实例进行比较approx(0.3)的事实。它通过返回一个特殊值来做到这一点:floatMyObjNotImplemented

>>> (0.1+0.2).__eq__(obj)
NotImplemented

对于实际的 pytest 实现,请查看python_api.py::ApproxScalar.


推荐阅读