Подсказки типа для приборов pytests, возвращающих методы

#python #python-3.x #pycharm #pytest

#python #python-3.x #pycharm #pytest

Вопрос:

Некоторые из моих приборов pytest возвращают метод. Я хотел бы использовать подсказки типа для всех моих методов. Сказать, что метод возвращает метод, который я могу использовать Callable здесь. Проблема здесь: я теряю функцию автозаполнения для аргументов в моей IDE PyCharm.

Без указания подсказки типа для возвращаемого значения прибора:

 @pytest.fixture
def create_project():
    def create(location: Path, force: bool = True) -> bool:
        # ...

    return create


def test_project(create_project):
    project_created = create_project()
 

введите описание изображения здесь

С подсказкой заданного типа:

 @pytest.fixture
def create_project() -> Callable[[Path, bool], bool]:
    def create(location: Path, force: bool = True) -> bool:
        # ...

    return create


def test_project(create_project):
    project_created = create_project()
 

введите описание изображения здесь

Другая проблема Callable заключается в том, что я должен описывать аргументы и возвращаемый тип один раз в приборе и в каждом тесте, где я использую этот прибор.

Итак, есть ли более эффективный способ сделать это?

Комментарии:

1. Примечание. Функции, возвращающие функции, часто называются «заводскими функциями»

Ответ №1:

Предполагаемый способ, похоже, использует протокол:

 from typing import Protocol


class ProjectMaker(Protocol):
    def __call__(self, location: Path, force: bool = True) -> bool: ...


@pytest.fixture
def create_project() -> ProjectMaker:
    def create(location: Path, force: bool = True) -> bool:
        ...

    return create


def test_project(create_project: ProjectMaker):
    project_created = create_project()
 

К сожалению, в настоящее время это не поддерживается в PyCharm (#PY-45438)

Комментарии:

1. def test_project(create_project: ProjectMaker) -> None: ...