python - 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
似乎是纯粹的巫术,有人可以解释它是如何完成它的巧妙小把戏的吗?
解决方案
这是一个标准数据模型挂钩到自定义__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)
的事实。它通过返回一个特殊值来做到这一点:float
MyObj
NotImplemented
>>> (0.1+0.2).__eq__(obj)
NotImplemented
对于实际的 pytest 实现,请查看python_api.py::ApproxScalar
.
推荐阅读
- sql - Oracle Apex 中选择列表中的条件语句
- xml - 如何在 SUMO 中添加传感器,让我获得汽车通过的瞬间和速度?
- google-sheets - Google 表格自定义边栏
- javascript - 如何更改 LoopBack 框架中的模型类
- javascript - Javascript异步函数流程
- twig - 如何在没有 Symfony4 的 Twig 2.x 中实现 Webpack Encore
- python - Python 类型注解,错误返回类型或无
- angular - 如何在 Angular 8 ASP.NET 中解决此构建错误
- php - WP_Query 帖子在循环之外获取术语列表?
- swift - 如何在 SwiftUI 中从颜色中获取 RGB 分量