我的一些 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
的另一个问题是,我必须在夹具中以及在我使用该夹具的每个测试中描述一次参数和返回类型。
那么有没有更有效的方法呢?
预期的方式似乎是使用协议:
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)
__call__
的 any 对象将被视为 ProjectMaker
。
我相信一个可接受的替代方案是使用
TypeAlias
来让你的类型提示更容易:
from pathlib import Path
from typing import TypeAlias
ProjectMaker: TypeAlias = Callable[[Path, bool], bool]
# Now use `ProjectMaker` throughout as before...
请注意,您不必使用 TypeAlias
。纯粹是为了明确该语句是类型别名而不是普通的变量声明。 (请参阅文档中的类型别名
)