Подтвердить что ты не робот

pytest fixtures Переопределение имени из внешнего объема [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. Лучшее предложение?
4b9b3361

Ответ 1

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

# 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

Ответ 2

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

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

Ответ 3

Документы Pytest для @pytest.fixture говорят следующее:

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

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

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