使用numpy isclose实现__eq__

时间:2016-10-17 15:51:51

标签: python python-3.x numpy floating-point precision

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

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

  1. __eq__表示完全比较。但是有一个类似于np.isclose
  2. 的功能
  3. __eq__表示完全比较。但是有一个类似于np.isclose的函数,__eq__每次调用时都会打印一个警告,并引用该函数。
  4. __eq__表示数字比较。
  5. 我想不出有人想要与这个类进行精确浮点比较的任何用例。因此选项三是我最喜欢的。 但我不想让用户感到惊讶。

1 个答案:

答案 0 :(得分:1)

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

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一样危险,但至少你现在可以控制何时启用危险行为