ImportError: невозможно импортировать имя 'isclose'

1

Я испытываю странную ошибку, когда модуль тестирует мой модуль 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.

Полные журналы доступны здесь.

Теги:
math
travis-ci
python-3.4
pytest

2 ответа

3
Лучший ответ

pytest имеет функцию approx для тестирования приблизительного равенства двух чисел, доступных для любой версии python. Утверждение

assert math.isclose(a, b, rel_tol=rt, abs_tol=at)

таким образом, можно заменить на

assert a == pytest.approx(b, rel=rt, abs=at)
3

Как мы можем сказать из связанного "полного журнала", вы используете 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: минимальный абсолютный уровень допуска - полезен для сравнений вблизи нуля.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню