如何在间接参数化中对request.param进行注释



在间接参数化示例中,我希望键入指示特定类型的提示request.param,例如str

问题是由于CCD_ 3的自变量必须是CCD_;可选的CCD_ 5属性"应该是(引用文档(。

有哪些替代方案?也许在fixt文档字符串或test_indirect文档字符串中记录类型提示?

@pytest.fixture
def fixt(request):
return request.param * 3
@pytest.mark.parametrize("fixt", ["a", "b"], indirect=True)
def test_indirect(fixt):
assert len(fixt) == 3

到目前为止(版本6.2(,pytest没有为param属性提供任何类型提示。如果您只需要键入param,而不考虑其余的FixtureRequest字段和方法,那么您可以内联自己的impl存根:

from typing import TYPE_CHECKING

if TYPE_CHECKING:
class FixtureRequest:
param: str
else:
from typing import Any
FixtureRequest = Any

@pytest.fixture
def fixt(request: FixtureRequest) -> str:
return request.param * 3

如果您想扩展FixtureRequest的现有类型,则存根处理会变得更加复杂:

from typing import TYPE_CHECKING

if TYPE_CHECKING:
from pytest import FixtureRequest as __FixtureRequest
class FixtureRequest(__FixtureRequest):
param: str
else:
from pytest import FixtureRequest

@pytest.fixture
def fixt(request: FixtureRequest) -> str:
return request.param * 3

理想情况下,pytest将允许FixtureRequest中的通用param类型,例如

P = TypeVar("P")  # generic param type
class FixtureRequest(Generic[P]):
def __init__(self, param: P, ...):
...

然后你只需要做

from pytest import FixtureRequest
@pytest.fixture
def fixt(request: FixtureRequest[str]) -> str:
return request.param * 3

然而,不确定这种类型是否符合当前pytest的代码库——我想它被省略是有原因的。。。

根据hoefling关于泛型的回答,您可以将泛型转换为TYPE_CHECKING代码:

from typing import TYPE_CHECKING, Generic, TypeVar
if TYPE_CHECKING:
from pytest import FixtureRequest as _FixtureRequest
T = TypeVar("T")
class FixtureRequest(_FixtureRequest, Generic[T]):
param: T
else:
from pytest import FixtureRequest

这样的代码就可以工作了,尽管您可能需要引用类型提示,因为pytest的FixtureRequest在运行时不是通用的:

@pytest.fixture
def fixt(request: "FixtureRequest[str]") -> str:
return request.param * 3

最新更新