You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 03:03:13