我担心这可能会因为一个软问题而被关闭, 但也许有一种明显的惯用方式。
我有一个包含大量存储在浮点数中的信息的类。
我正在考虑使用与__eq__
类似的非精确但数值等价的方法来实现np.isclose
方法。目前我有三个选择:
__eq__
表示完全比较。但是有一个类似于np.isclose
__eq__
表示完全比较。但是有一个类似于np.isclose
的函数,__eq__
每次调用时都会打印一个警告,并引用该函数。__eq__
表示数字比较。我想不出有人想要与这个类进行精确浮点比较的任何用例。因此选项三是我最喜欢的。 但我不想让用户感到惊讶。
答案 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一样危险,但至少你现在可以控制何时启用危险行为