嵌套 defaultdict 的类型提示

dmj*_*mjy 0 python defaultdict mypy python-typing

编写类型提示的正确方法是什么defaultdict(lambda: defaultdict(set))

我使用Python 3.10.5和mypy 0.971,发现mypy返回错误,因为var = defaultdict(lambda: defaultdict(set))没有类型提示。

前提

  • 第一个defaultdict和第二个defaultdict的所有键都是str
  • 第一个defaultdict的值为defaultdict。第二个 defaultdict 的值为set。(这可能是显而易见的。)

示例代码

from collections import defaultdict
var = defaultdict(lambda: defaultdict(set))
Run Code Online (Sandbox Code Playgroud)

输出

test.py:2: error: Need type annotation for "var"
Run Code Online (Sandbox Code Playgroud)

fun*_*man 6

Python 3.9开始,您可以使用defaultdictset本身作为注释:

var: defaultdict[str, defaultdict[str, set]] = defaultdict(lambda: defaultdict(set))
Run Code Online (Sandbox Code Playgroud)

DefaultDict对于早期的 Python 版本,打字模块有一个特殊的类型:

from collections import defaultdict
from typing import DefaultDict, Set

var: DefaultDict[str, DefaultDict[str, Set]] = defaultdict(lambda: defaultdict(set))
Run Code Online (Sandbox Code Playgroud)