mypy 和嵌套字典理解

vhe*_*emt 5 python list-comprehension dictionary-comprehension mypy

我绝对不是 mypy 的专家,但有一个我真的不明白的错误。

假设我有这本字典,我想解析它并通过字典理解创建另一本字典。

my_dict = {
    'type1': {
        'category1': [
            'subcategory1',
            'subcategory2',
        ],
    },
    'type2': {
        'category2': [
            'subcategory3',
        ],
        'category3': [],
    },
}
Run Code Online (Sandbox Code Playgroud)

字典理解:

new_dict = {
    subcategory: {
        'category': category,
        'type': type,
    }
    for type, categories in my_dict.items()
    for category, subcategories in categories.items()
    for subcategory in subcategories
}
Run Code Online (Sandbox Code Playgroud)

和预期输出:

{
    'subcategory1': {
        'category': 'category1',
        'type': 'type1'
    },
    'subcategory2': {
        'category': 'category1',
        'type': 'type1'
    },
    'subcategory3': {
        'category': 'category2',
        'type': 'type2'
    }
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,mypy 会因为空而抱怨category3,但会出现'error:"object" has no attribute "items"'一条引用上一行的错误消息 ( )。

有什么建议吗?

提前致谢

Mic*_*x2a 5

问题是 mypy 无法推断类型my_dict——对于 mypy 来说,自然推断类型太复杂了。

您可以通过在运行 mypy 之前添加该行来自行确认reveal_type(my_dict)。(Mypy 使用函数名称的特殊情况来帮助调试)。推断出的类型最终是Dict[str, object],或者类似的东西。

您可以通过显式给出my_dict类型来解决此问题。如果您使用的是 Python 3.6+,则可以使用新的变量注释语法来执行此操作,如下所示:

from typing import Dict, List

my_dict: Dict[str, Dict[str, List[str]]] = { ... }
Run Code Online (Sandbox Code Playgroud)

如果您使用的是早期版本的 Python,请使用基于注释的语法来注释变量。

  • 这种语法/方法仍然是首选吗?或者现在是 `dict[ str, list[str]]` (2认同)