Когда я пишу специфичные для проекта плагины c pytest
, я часто нахожу объект Config
полезным для добавления моих собственных свойств. Пример:
from _pytest.config import Config
def pytest_configure(config: Config) -> None:
config.fizz = "buzz"
def pytest_unconfigure(config: Config) -> None:
print(config.fizz)
Очевидно, что в классе _pytest.config.Config
нет атрибута fizz
, поэтому запуск mypy
над приведенным фрагментом приводит к
conftest.py:5: error: "Config" has no attribute "fizz"
conftest.py:8: error: "Config" has no attribute "fizz"
(обратите внимание, что pytest
пока нет выпуска с подсказками типов, поэтому, если вы действительно хотите воспроизвести ошибку локально, установите форк, следуя инструкциям в в этом комментарии ).
Иногда переопределение класса для Проверка типов может предложить быструю помощь:
from typing import TYPE_CHECKING
if TYPE_CHECKING:
from _pytest.config import Config as _Config
class Config(_Config):
fizz: str
else:
from _pytest.config import Config
def pytest_configure(config: Config) -> None:
config.fizz = "buzz"
def pytest_unconfigure(config: Config) -> None:
print(config.fizz)
Однако, помимо загромождения кода, обходной путь подкласса очень ограничен: добавление, например,
from pytest import Session
def pytest_sessionstart(session: Session) -> None:
session.config.fizz = "buzz"
заставит меня также переопределить Session
для проверки типов.
Каков наилучший способ решить эту проблему? Config
является одним из примеров, но у меня обычно есть еще несколько в каждом проекте (настройки проекта c для сбора тестов / вызова / отчетности и т. Д. c). Я мог бы представить свою собственную версию заглушек pytest
, но тогда мне нужно было бы повторять это для каждого проекта, что очень утомительно.