相关疑难解决方法(0)

类型检查动态添加的属性

在编写特定于项目的pytest插件时,我经常发现该Config对象对于附加我自己的属性很有用。例子:

from _pytest.config import Config


def pytest_configure(config: Config) -> None:
    config.fizz = "buzz"

def pytest_unconfigure(config: Config) -> None:
    print(config.fizz)
Run Code Online (Sandbox Code Playgroud)

显然,类中没有fizz属性_pytest.config.Config,所以运行mypy上面的代码片段会产生

conftest.py:5: error: "Config" has no attribute "fizz"
conftest.py:8: error: "Config" has no attribute "fizz"
Run Code Online (Sandbox Code Playgroud)

(请注意,pytest目前还没有带有类型提示的版本,因此如果您想在本地实际重现错误,请按照此评论中的步骤安装一个 fork )。

有时重新定义用于类型检查的类可以提供快速帮助:

from typing import TYPE_CHECKING

if TYPE_CHECKING:
    from _pytest.config import Config as _Config

    class Config(_Config):
        fizz: str

else:
    from _pytest.config import Config



def pytest_configure(config: Config) -> None:
    config.fizz = …
Run Code Online (Sandbox Code Playgroud)

python typechecking mypy

8
推荐指数
1
解决办法
1016
查看次数

间接参数化时如何注释request.param?

间接参数化示例中,我想输入指示request.param特定类型的提示,str例如 a。

问题是,由于参数必须fixt是固定request装置,因此似乎无法指示通过“可选param属性”传递的参数应该是什么类型(引用文档)。

有哪些替代方案?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
Run Code Online (Sandbox Code Playgroud)

python fixtures type-hinting pytest

8
推荐指数
2
解决办法
4908
查看次数

标签 统计

python ×2

fixtures ×1

mypy ×1

pytest ×1

type-hinting ×1

typechecking ×1