如何将未类型化字典传给期望TypedDict的方法且避免mypy报错?
TypedDict传参的类型兼容优化
问题场景
将字典传给期望TypedDict类型(Params)的foo方法时,直接传入字典字面量一切正常,但先赋值给configs变量后,mypy会报类型不兼容错误(提示dict[str, str]与Params不匹配);而PyCharm只要检测到键值正确就不会报错。希望在不给configs显式加类型标注的前提下,优化foo和Params的使用方式。
代码示例
from typing import TypedDict class Params(TypedDict): a: str b: str def foo(config: Params): pass foo({"a": "a", "b": "b"}) # mypy正常通过 configs = {"a": "a", "b": "b"} foo(configs) # mypy报错:Argument 1 to "foo" has incompatible type "dict[str, str]"; expected "Params" [arg-type]
优化方案
方案1:使用类型断言(cast)
在传参时通过cast将字典强制转换为Params类型,无需给configs额外加标注:
from typing import TypedDict, cast class Params(TypedDict): a: str b: str def foo(config: Params): pass configs = {"a": "a", "b": "b"} foo(cast(Params, configs)) # mypy正常通过
方案2:封装为返回TypedDict的函数
将字典的创建逻辑封装成返回Params类型的函数,mypy会自动推导变量configs的类型为Params:
from typing import TypedDict class Params(TypedDict): a: str b: str def foo(config: Params): pass def get_configs() -> Params: return {"a": "a", "b": "b"} configs = get_configs() foo(configs) # mypy正常通过
方案3:极简类型标注(可选)
如果可以接受极简标注,可直接给变量加Params注解,写法简洁且能通过mypy检查:
configs: Params = {"a": "a", "b": "b"} foo(configs) # mypy正常通过
内容的提问来源于stack exchange,提问作者aleneum
相关产品推荐
相关产品推荐

