Я испытываю странную ошибку, когда модуль тестирует мой модуль Python:
⅔ сборки строятся нормально, но один из них не может импортировать isclose
из стандартной math
библиотеки.
Ошибка воспроизводится ниже:
==================================== ERRORS ====================================
______________________ ERROR collecting tests/test_yau.py ______________________
ImportError while importing test module '/home/travis/build/Benjamin-Lee/squiggle/tests/test_yau.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
tests/test_yau.py:5: in <module>
from math import isclose
E ImportError: cannot import name 'isclose'
!!!!!!!!!!!!!!!!!!! Interrupted: 1 errors during collection !!!!!!!!!!!!!!!!!!!!
=========================== 1 error in 0.29 seconds ============================
The command "pytest --cov=squiggle" exited with 2.
Нет файла с именем math.py
в том же каталоге (или вообще в моем пакете). Что может быть причиной этого?
Повторная перезагрузка сборки несколько раз не исправила эту ошибку, и она появляется только в Python 3.4.
Полные журналы доступны здесь.
pytest
имеет функцию approx
для тестирования приблизительного равенства двух чисел, доступных для любой версии python. Утверждение
assert math.isclose(a, b, rel_tol=rt, abs_tol=at)
таким образом, можно заменить на
assert a == pytest.approx(b, rel=rt, abs=at)
Как мы можем сказать из связанного "полного журнала", вы используете Python 3.4.6.
$ python --version Python 3.4.6
Функция math.isclose
была введена в Python 3.5, поэтому ее нельзя импортировать. Либо установите более позднюю версию Python (т.е. 3. 5+), либо определите свою собственную функцию isclose
, math
модуль будет определен примерно следующим образом:
def isclose(a, b, rel_tol=1e-9, abs_tol=0.0):
return abs(a-b) <= max(rel_tol * max(abs(a), abs(b)), abs_tol)
# tests:
print(0.1 + 0.2)
print(0.1 + 0.2 == 0.3)
print(isclose(0.1 + 0.2, 0.3))
# outputs:
0.30000000000000004
False
True
a
иb
: это два значения, подлежащие проверке на относительную близость
rel_tol
: относительный допуск - это допустимая погрешность относительно большей абсолютной величиныa
илиb
. Например, чтобы установить допуск 5%, пройдитеrel_tol=0.05
. Допуск по умолчанию равен 1е-9, что гарантирует, что два значения одинаковы в пределах примерно девяти десятичных цифр.rel_tol
должен быть больше 0.0
abs_tol
: минимальный абсолютный уровень допуска - полезен для сравнений вблизи нуля.