Add user documentation
The new doc section explains why we raise a `NotImplementedError`.
This commit is contained in:
parent
309152d9fd
commit
d3ab1b9df4
|
@ -1,6 +1,5 @@
|
||||||
import math
|
import math
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
import py
|
import py
|
||||||
|
|
||||||
from _pytest.compat import isclass, izip
|
from _pytest.compat import isclass, izip
|
||||||
|
@ -32,6 +31,12 @@ class ApproxBase(object):
|
||||||
|
|
||||||
__hash__ = None
|
__hash__ = None
|
||||||
|
|
||||||
|
def __gt__(self, actual):
|
||||||
|
raise NotImplementedError
|
||||||
|
|
||||||
|
def __lt__(self, actual):
|
||||||
|
raise NotImplementedError
|
||||||
|
|
||||||
def __ne__(self, actual):
|
def __ne__(self, actual):
|
||||||
return not (actual == self)
|
return not (actual == self)
|
||||||
|
|
||||||
|
@ -60,6 +65,12 @@ class ApproxNumpy(ApproxBase):
|
||||||
return "approx({0!r})".format(list(
|
return "approx({0!r})".format(list(
|
||||||
self._approx_scalar(x) for x in self.expected))
|
self._approx_scalar(x) for x in self.expected))
|
||||||
|
|
||||||
|
def __gt__(self, actual):
|
||||||
|
raise NotImplementedError
|
||||||
|
|
||||||
|
def __lt__(self, actual):
|
||||||
|
raise NotImplementedError
|
||||||
|
|
||||||
def __eq__(self, actual):
|
def __eq__(self, actual):
|
||||||
import numpy as np
|
import numpy as np
|
||||||
|
|
||||||
|
@ -358,6 +369,22 @@ def approx(expected, rel=None, abs=None, nan_ok=False):
|
||||||
is asymmetric and you can think of ``b`` as the reference value. In the
|
is asymmetric and you can think of ``b`` as the reference value. In the
|
||||||
special case that you explicitly specify an absolute tolerance but not a
|
special case that you explicitly specify an absolute tolerance but not a
|
||||||
relative tolerance, only the absolute tolerance is considered.
|
relative tolerance, only the absolute tolerance is considered.
|
||||||
|
|
||||||
|
.. warning::
|
||||||
|
|
||||||
|
In order to avoid inconsistent behavior, a ``NotImplementedError`` is
|
||||||
|
raised for ``__lt__`` and ``__gt__`` comparisons. The example below
|
||||||
|
illustrates the problem::
|
||||||
|
|
||||||
|
assert approx(0.1) > 0.1 + 1e-10 # calls approx(0.1).__gt__(0.1 + 1e-10)
|
||||||
|
assert 0.1 + 1e-10 > approx(0.1) # calls approx(0.1).__lt__(0.1 + 1e-10)
|
||||||
|
|
||||||
|
In the second example one expects ``approx(0.1).__le__(0.1 + 1e-10)``
|
||||||
|
to be called. But instead, ``approx(0.1).__lt__(0.1 + 1e-10)`` is used to
|
||||||
|
comparison. This is because the call hierarchy of rich comparisons
|
||||||
|
follows a fixed behavior. `More information...`__
|
||||||
|
|
||||||
|
__ https://docs.python.org/3/reference/datamodel.html#object.__ge__
|
||||||
"""
|
"""
|
||||||
|
|
||||||
from collections import Mapping, Sequence
|
from collections import Mapping, Sequence
|
||||||
|
|
Loading…
Reference in New Issue