Pytest: прибл. () С>, <, <= и> = - PullRequest
0 голосов
/ 11 января 2019

Итак документация для состояний pytest следующее:

Внимание:
Изменено в версии 3.2.

Чтобы избежать противоречивого поведения, TypeError вызывается для >, >=, < и <= сравнений. Пример ниже иллюстрирует проблему:

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)

Во втором примере ожидается, что будет вызван approx(0.1).__le__(0.1 + 1e-10). Но вместо этого approx(0.1).__lt__(0.1 + 1e-10) используется для сравнения. Это потому, что иерархия вызовов богатых сравнений следует фиксированному поведению.

Теперь я не знаю, глуп ли я, но зачем ожидать __le__ во втором примере? Я определенно не Я ожидаю __lt__.

Я не знаю, что это пытается сказать честно. И я не понимаю, почему функции не могут быть такими:

def __gt__(self, actual):
    return actual > self.expected and other != self

def __lt__(self, actual):
    return actual < self.expected and other != self

с вариантами __ge__ и __le__, использующими or вместо and.

1 Ответ

0 голосов
/ 11 января 2019

approx предназначен для использования при сравнении чисел типа с плавающей запятой с операторами == !=, чтобы избежать запутанных примеров 0.1 + 0.2 != 0.3

приведенный пример следует интерпретировать так, как если бы пользователь хотел ответить 0.1000000001 больше 0.1? ожидаемый ответ True

Теперь, если вы используете approx, это будет означать False, поскольку 0.1000000001 == approx(0.1) (если вы использовали __le__, это будет означать True - поэтому они написали, что __le__ ожидается)

поэтому использование приблизительного значения - нечеткое число с большим или меньшим диапазоном не является интуитивно понятным - такие вопросы, как X больше, чем около 7, обычно не используются, и если вам нужны странные нечеткие диапазоны, вы должны указать это явно

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...