#python #python-3.x #pytest
#python #python-3.x #pytest
Вопрос:
Я использую интерпретацию для проекта, и во время тестов я предоставляю несколько образцов (просто для ускорения тестов), что приводит к предупреждению пользователя
/usr/local/lib/python3.8/site-packages/interpret/glassbox/ebm/utils.py:91: UserWarning: Too few samples per class, adapting test size to guarantee 1 sample per class.
warnings.warn(
Я пытался подавить это предупреждение до сих пор, но безуспешно, я даже пытался использовать карт-бланш ignore::UserWarning
в своих предупреждениях о фильтрах pytest следующим образом:
[tool:pytest]
addopts = -s --maxfail=1 --failed-first --color=yes
filterwarnings = ignore::_pytest.warning_types.PytestUnknownMarkWarning
ignore::UserWarning
;ignore::UserWarning:interpret
norecursedirs = docs .mypy_cache
python_files = test_*.py
Я углубился в файл, который выдал предупреждение, где фактические строки, которые выдают предупреждение, следующие:
if n_test_samples < y_uniq: # pragma: no cover
warnings.warn(
"Too few samples per class, adapting test size to guarantee 1 sample per class."
)
test_size = y_uniq
которое должно быть UserWarning
, так как это значение по умолчанию для warnings.warn. Тогда возникает вопрос, как можно было бы подавить такое предупреждение, поскольку то, что я использовал ранее, не работает для этого случая (в конфигурации pytest)?
Вот максимально изолированный пример вышеупомянутой проблемы (с использованием mark
опции для имитации нашей настройки):
from interpret.glassbox import ExplainableBoostingClassifier
from numpy import array, ravel
from pytest import mark
@mark.filterwarnings("ignore::UserWarning")
def test():
features = array([
[0.4, 0.6, 0.8],
[0.3, 0.7, 0.9],
[0.1, 0.5, 1.1],
[0.2, 0.8, 1.0],
[0.2, 6.4, 1.2],
[0.5, 8.6, 0.9],
[0.5, 7.9, 0.7],
[0.4, 7.5, 0.9],
])
labels = ravel(array([
["class_1"],
["class_1"],
["class_1"],
["class_1"],
["class_2"],
["class_2"],
["class_2"],
["class_2"],
]))
model = ExplainableBoostingClassifier()
model.fit(X=features, y=labels)
# call funcy, should be done through pytest though
test()
Комментарии:
1. Вы проверили код в
interpret
, который выдает предупреждение? Вы должны увидеть, какое предупреждение там создается.2. У меня есть, но в неправильном месте, корректирующий вопрос соответствующим образом
3. Ваша конфигурация, похоже, в
setup.cfg
, правильно? Я знаю, что это работает вpytest.ini
— может быть, проще настроить это вpytest.ini
? Из справки pytest:Usage of setup.cfg is not recommended unless for very simple use cases. .cfg files use a different parser than pytest.ini and tox.ini which might cause hard to track down problems.
Ответ №1:
Скорее всего, ваша проблема в том, что у вас есть pytest.ini
или tox.ini
, который считывается pytest. Если какой-либо из этих файлов существует в вашем path и содержит [pytest]
раздел, это заменяет [tool:pytest]
раздел setup.cfg
. Таким образом, решение заключается либо в удалении pytest.ini
/ tox.ini
, либо в перемещении filterwarnings
строки в pytest.ini
:
[pytest]
filterwarnings = ignore::UserWarning:interpret
Как упоминалось в комментариях, в документации pytest указано:
Использование setup.cfg не рекомендуется, за исключением очень простых случаев использования. файлы .cfg используют другой анализатор, чем pytest.ini и tox.ini, что может вызвать проблемы с отслеживанием.
Таким образом, второй вариант, вероятно, является лучшим.
Комментарии:
1. Проект действительно недавно перешел на Tox, поэтому указание на это, безусловно, полезно. Однако добавление
ignore::UserWarning:interpret
к tox по-прежнему дает те же результаты (которые могут быть связаны с периферийными аспектами, такими как docker, make и т.д., Которые я сейчас рассмотрю).2. Возможно,
interpret
это не модуль, из которого исходит предупреждение, а скорее подмодуль — я этого не проверял. Я бы попытался сначала отключить все предупреждения пользователя (как вы сделали в своем вопросе), чтобы убедиться, что это не проблема.3. Это один из шагов, которые я попробовал после вашего ответа, просто полное подавление всех предупреждений пользователя как в
tox.ini
, так и в обоихsetup.cfg
файлах (которые используются внутри служб, развернутых как часть проекта). Следовательно, теперь я боюсь, что это связано с настройкой проекта, что было бы вне моего контроля.4. В качестве последнего теста вы могли бы попытаться поместить
pytest.ini
в корневой каталог, куда вы добавляете подавление, если это возможно. Кроме этого, у меня больше нет идей (ну, вы могли бы выполнить подавление в командной строке pytest, но это, вероятно, вне вашего контроля).