使用 numpy isclose 实现 __eq__
Implementing __eq__ using numpy isclose
我担心这可能会因为是一个软问题而被关闭,
但也许有一个明显的惯用方式。
我有一个 class,其中包含大量存储在浮点数中的信息。
我正在考虑使用类似于 np.isclose
的不精确但数值等价来实现 __eq__
方法。目前我有三个选择:
__eq__
表示精确比较。但是有个函数类似np.isclose
__eq__
表示精确比较。但是有一个类似于 np.isclose
的函数,并且 __eq__
每次调用它时都会打印一条警告并引用该函数。
__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 一样危险,但至少你现在可以控制何时启用危险行为
我担心这可能会因为是一个软问题而被关闭, 但也许有一个明显的惯用方式。
我有一个 class,其中包含大量存储在浮点数中的信息。
我正在考虑使用类似于 np.isclose
的不精确但数值等价来实现 __eq__
方法。目前我有三个选择:
__eq__
表示精确比较。但是有个函数类似np.isclose
__eq__
表示精确比较。但是有一个类似于np.isclose
的函数,并且__eq__
每次调用它时都会打印一条警告并引用该函数。__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 一样危险,但至少你现在可以控制何时启用危险行为