#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: ...