【发布时间】:2021-08-07 19:22:04
【问题描述】:
我在my_module.py 上有一个简单的方法,带有签名:
def my_method(value: float, extra: str = "something") -> str:
pass
然后我对test_my_module.py 进行了参数化测试:
from typing import List
from typing import Union
import pytest
import my_module
@pytest.mark.parametrize(
"params, expected",
[
([1.0], "result1"),
([2.0], "result2"),
([2.0, "extra"], "result3")
],
)
def test_my_method(params: List[Union[int, str]], expected: str) -> None:
assert my_module.my_method(*params) == expected
当我运行诸如typeguard 之类的动态类型测试时,它通过了。但是使用mypy 我得到了这些[arg-type] 错误:
tests/test_my_module.py: note: In function "test_my_method":
tests/test_my_module.py:50:30: error: Argument 1 to "my_method" has incompatible type "*List[Union[int, str]]"; expected "float"
[arg-type]
assert my_module.my_method(*params) == expected
^
tests/test_my_module.py:50:30: error: Argument 1 to "my_method" has incompatible type "*List[Union[int, str]]"; expected "str"
[arg-type]
assert my_module.my_method(*params) == expected
^
不太确定我应该如何注释这些类型以使其通过。请注意,这是一个最小的示例,所以我想在我创建的列表中解压缩参数列表 params 以参数化测试。
有什么想法吗?
【问题讨论】:
-
尝试将您的测试函数注释为
def test_my_method(params: Union[Tuple[float], Tuple[float, str]], expected: str) -> None:
标签: python pytest type-hinting mypy python-typing