Светильники pytest Переопределение имени из внешней области видимости [pylint]

Я изучаю Pytest, и я накладываю свой код с помощью Pylint. Но Пилинт все же жалуется на:
W0621: Redefining name %r from outer scope (line %s)

для следующего примера из pytest:

# test_wallet.py

@pytest.fixture
def my_wallet():
    '''Returns a Wallet instance with a zero balance'''
    return Wallet()

@pytest.mark.parametrize("earned,spent,expected", [
    (30, 10, 20),
    (20, 2, 18),
])
def test_transactions(my_wallet, earned, spent, expected):
    my_wallet.add_cash(earned)
    my_wallet.spend_cash(spent)
    assert my_wallet.balance == expected

Переопределение имени my_wallet из внешней сферы.

Я нашел обходной путь, чтобы добавить _ префикс к имени прибора: _my_wallet,

Что было бы лучше, если бы я хотел сохранить приборы в одном файле с функциями?

  1. Подготовить все приборы с _?
  2. Отключить это pylint проверить на тесты?
  3. Лучшее предложение?

1 ответ

Документы pytest для@pytest.fixture скажи это:

Если прибор используется в том же модуле, в котором он определен, имя функции прибора будет затенено функцией arg, которая запрашивает прибор; один из способов решить эту проблему - назвать декорированную функциюfixture_<fixturename> а затем используйте @pytest.fixture(name='<fixturename>').

Таким образом, это решение похоже на ваш вариант 1, за исключением того, что автор pytest предлагает немного более описательное имя для функции фикстуры.

Описание в документации также намекает на другое решение, которое заключается в перемещении светильников в conftest.pyпоэтому они не находятся в том же модуле, что и тестовый код, использующий фикстуры. Это расположение также полезно для совместного использования приборов между тестовыми модулями.

Я просто отключил это правило в моих тестовых файлах:

# pylint: disable=redefined-outer-name
# ^^^ this
import pytest

@pytest.fixture
def my_wallet():
    '''Returns a Wallet instance with a zero balance'''
    return Wallet()

@pytest.mark.parametrize("earned,spent,expected", [
    (30, 10, 20),
    (20, 2, 18),
])
def test_transactions(my_wallet, earned, spent, expected):
    my_wallet.add_cash(earned)
    my_wallet.spend_cash(spent)
    assert my_wallet.balance == expected

Добавьте параметр имени для прибора и префикс fixture_ в def.

@pytest.fixture(name="wallet")
def fixture_wallet():
    '''Returns a Wallet instance with a zero balance'''
    return Wallet()

@pytest.mark.parametrize("earned,spent,expected", [
    (30, 10, 20),
    (20, 2, 18),
])
def test_transactions(my_wallet, earned, spent, expected):
    my_wallet.add_cash(earned)
    my_wallet.spend_cash(spent)
    assert my_wallet.balance == expected

Обычно он отключен ( 1, 2).

Существует плагин pylint-pytest, который пытается исправить некоторые проблемы. Но ошибка W0621 еще не исправлена, и плагин, похоже, заброшен (последнее обновление было в 2013 году).

Другие вопросы по тегам