使用 numpy isclose 实现 __eq__

Implementing __eq__ using numpy isclose

我担心这可能会因为是一个软问题而被关闭, 但也许有一个明显的惯用方式。

我有一个 class,其中包含大量存储在浮点数中的信息。 我正在考虑使用类似于 np.isclose 的不精确但数值等价来实现 __eq__ 方法。目前我有三个选择:

  1. __eq__表示精确比较。但是有个函数类似np.isclose
  2. __eq__表示精确比较。但是有一个类似于 np.isclose 的函数,并且 __eq__ 每次调用它时都会打印一条警告并引用该函数。
  3. __eq__表示数值比较。

我想不出任何用例,有人想用这个 class 进行精确的浮点比较。因此,选项三是我的最爱。 但我不想让用户感到惊讶。

一个选项是添加一个上下文管理器来切换模式:

from contextlib import contextmanager
class MyObject(object):
    _use_loose_equality = False
    @contextmanager
    @classmethod
    def loose_equality(cls, enabled=True):
        old_mode = cls._use_loose_equality
        cls._use_loose_equality = enabled
        try:
            yield
        finally:
            cls._use_loose_equality = old_mode

    def __eq__(self):
        if self._use_loose_equality:
            ...
        else:
            ...

您将用作:

x = MyObject(1.1)
y = MyObject(1.100001)
assert x != y
with MyObject.loose_equality():
    assert x == y

当然,这仍然和 3 一样危险,但至少你现在可以控制何时启用危险行为