使用pytest测试时,如何让PyCharm忽略非预期变量类型警告?
解决PyCharm测试中故意传错类型的警告问题
嘿,作为Python和pytest新手,遇到这种想测试异常但被编辑器类型警告打扰的情况太正常了!下面几种方法可以帮你精准告知编辑器“我是故意这么做的”,而不是全局忽略所有警告:
方法1:使用typing.cast欺骗类型检查器
你可以用typing.cast告诉类型检查器,你明确知道这个参数的类型“不符合”注解,但就是要这么传。这样PyCharm就会停止警告:
import pytest from typing import cast def concatenate_string(first_string: str, second_string: str) -> str: return first_string + second_string def test_concatenate_string_raises_type_error(): with pytest.raises(TypeError) as pytest_wrapped_e: # 用cast让检查器认为1是str类型,实则我们故意传int来触发异常 concatenate_string('abc', cast(str, 1)) assert pytest_wrapped_e.type == TypeError # 注意:你原来的代码里变量名写错了,应该是pytest_wrapped_e而不是e
方法2:精准使用# type: ignore注释
如果不想引入额外的类型工具,可以在引发警告的那一行末尾添加针对性的忽略注释,指定只忽略参数类型不匹配的警告,不会影响其他潜在问题的提示:
import pytest def concatenate_string(first_string: str, second_string: str) -> str: return first_string + second_string def test_concatenate_string_raises_type_error(): with pytest.raises(TypeError) as pytest_wrapped_e: # 只忽略这个调用的参数类型警告 concatenate_string('abc', 1) # type: ignore[arg-type] assert pytest_wrapped_e.type == TypeError
方法3:用Any类型变量中转
如果你使用Python 3.9+,可以借助typing.Any类型来中转参数,告诉类型检查器这个变量的类型是任意的,这样传参时就不会触发警告:
import pytest from typing import Any def concatenate_string(first_string: str, second_string: str) -> str: return first_string + second_string def test_concatenate_string_raises_type_error(): invalid_arg: Any = 1 # 标注为Any,允许任意类型 with pytest.raises(TypeError) as pytest_wrapped_e: concatenate_string('abc', invalid_arg) assert pytest_wrapped_e.type == TypeError
另外还要提醒你:你原来的测试代码里有个小错误——assert e.type == TypeError中的e并没有定义,应该用你捕获异常的变量名pytest_wrapped_e,上面的示例已经帮你修正了这个问题~
内容的提问来源于stack exchange,提问作者Vaclav Pelc
相关产品推荐
相关产品推荐

