Python3.8中如何实例化符合嵌套DefaultDict类型注解的defaultdict
解决方案
问题出在defaultdict(defaultdict)的写法中,Pyright无法自动推断嵌套defaultdict的具体类型参数,导致类型不匹配。你需要明确指定内层defaultdict的工厂函数,让它返回符合注解要求的类型。
方法一:用lambda明确内层defaultdict的类型
直接通过lambda创建内层defaultdict,指定其值类型为MyClass:
from typing import DefaultDict from collections import defaultdict class MyClass: pass d: DefaultDict[int, DefaultDict[int, MyClass]] = defaultdict(lambda: defaultdict(MyClass)) d[1][2] = MyClass()
外层defaultdict的工厂函数返回defaultdict[int, MyClass],完全匹配声明的类型注解,Pyright能正确识别类型。
方法二:显式指定内层defaultdict的类型参数
如果需要更清晰地标注类型,可以显式写出内层defaultdict的类型参数:
from typing import DefaultDict from collections import defaultdict class MyClass: pass d: DefaultDict[int, DefaultDict[int, MyClass]] = defaultdict( lambda: defaultdict[int, MyClass](MyClass) ) d[1][2] = MyClass()
这种写法类型标注更明确,适合需要强调类型细节的场景,同样能通过Pyright的类型检查。
原写法报错原因
直接写defaultdict(defaultdict)时,Pyright会把内层defaultdict推断为defaultdict[Unknown, Unknown],外层则变成defaultdict[Unknown, defaultdict[Unknown, Unknown]],和你声明的DefaultDict[int, DefaultDict[int, MyClass]]类型不匹配,因此抛出错误。通过明确工厂函数的返回类型,就能让类型推断符合预期。
内容的提问来源于stack exchange,提问作者Eisen
相关产品推荐
相关产品推荐

