【发布时间】:2023-02-15 08:12:01
【问题描述】:
考虑以下玩具示例:
import pytest
def add(a: float) -> float:
if not isinstance(a, float):
raise ValueError("a must be of type float")
return 10 + a
def test_add_wrong_type() -> None:
with pytest.raises(ValueError) as err:
add("foo") # mypy is complaining here
assert str(err.value) == "a must be of type float"
mypy 抱怨如下:
“add”的参数 1 具有不兼容的类型“str”;预期的“浮动”[arg-type]
好吧,mypy 是正确的。但是,在那种情况下,我故意输入了错误的类型。我怎样才能告诉mypy忽略这一行`?
换句话说,什么是测试不正确输入类型的 pythonic 方法?
【问题讨论】:
-
# type: ignore[arg-type]? -
我认为 mypy 的价值在于,当正确集成时,它消除了完全编写此类测试的需要。
-
无论如何,你都会从
10 + a得到一个ValueError;我不确定仅仅更改与之关联的消息是否值得运行时成本。 -
cast(float, "foo")也可以。 -
实际上
# type: ignore[arg-type]是这里唯一语义正确的事情:你没有cast,你没有假装"foo"是一个浮点数,你发出的调用从打字的角度来看是无效的。类型检查器会警告您这个事实——但是,您仍然想继续,因为这是一个测试,并且您正在测试不安全调用的行为。type: ignorecmets 没有任何问题,python 甚至不是打字稿,当你@ts-ignore时,所有 linters 都疯狂地哭泣,直到你禁用这个奇怪的规则集。