Невозможно подавить предупреждение пользователя, возвращенное интерпретацией

#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, но это, вероятно, вне вашего контроля).