unittest assertDictEqual中TypedDict的类型不正确警告问题
解决unittest中TypedDict与assertDictEqual的类型警告问题
出现警告的核心原因是:TypedDict属于静态类型注解,运行时本质就是普通字典,但类型检查器会将其视为独立类型,而assertDictEqual的参数类型要求是Mapping[Any, object],因此触发类型不匹配提示。以下是几种精准消除警告的方法:
方法1:使用typing.cast做类型断言
类似TypeScript的as关键字,cast可以明确告知类型检查器变量的实际兼容类型:
import typing import unittest from typing import cast, Mapping class FooBarStruct(typing.TypedDict): foo: str bar: int def create_foo_bar_struct() -> FooBarStruct: return {'foo': 'baz', 'bar': 1} class TestFooBarStruct(unittest.TestCase): def test_foo_bar(self): expected: FooBarStruct = {'foo': 'baz', 'bar': 1} # 将TypedDict断言为符合要求的Mapping类型 self.assertDictEqual(cast(Mapping[Any, object], expected), create_foo_bar_struct())
也可以直接断言为dict,效果完全一致:cast(dict, expected)
方法2:显式转换为普通dict
由于TypedDict运行时就是标准字典,直接转换不会有任何性能损耗,同时能让类型检查器识别为标准字典类型:
class TestFooBarStruct(unittest.TestCase): def test_foo_bar(self): expected: FooBarStruct = {'foo': 'baz', 'bar': 1} self.assertDictEqual(dict(expected), create_foo_bar_struct())
方法3:类型忽略注释(不推荐)
如果需要快速屏蔽警告,可在断言行添加注释,但该方式会忽略该行所有类型检查问题,精准度不足:
self.assertDictEqual(expected, create_foo_bar_struct()) # type: ignore
内容的提问来源于stack exchange,提问作者Ash Oldershaw
相关产品推荐
相关产品推荐

