返回方法的 pytests 固定装置的类型提示

问题描述 投票:0回答:2

我的一些 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
的另一个问题是,我必须在夹具中以及在我使用该夹具的每个测试中描述一次参数和返回类型。

那么有没有更有效的方法呢?

python python-3.x pycharm pytest
2个回答
10
投票

预期的方式似乎是使用协议

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)


0
投票
更具体地说,协议旨在实现鸭子类型(例如“可迭代协议”)。上述用法的问题在于,使用所示签名实现

__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
。纯粹是为了明确该语句是类型别名而不是普通的变量声明。 (请参阅文档中的

类型别名

© www.soinside.com 2019 - 2024. All rights reserved.