mypy 和嵌套字典理解

mypy and nested dict comprehension

我肯定不是mypy专家,但是有一个错误我真的没看懂

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

my_dict = {
    'type1': {
        'category1': [
            'subcategory1',
            'subcategory2',
        ],
    },
    'type2': {
        'category2': [
            'subcategory3',
        ],
        'category3': [],
    },
}

字典理解:

new_dict = {
    subcategory: {
        'category': category,
        'type': type,
    }
    for type, categories in my_dict.items()
    for category, subcategories in categories.items()
    for subcategory in subcategories
}

和预期输出:

{
    'subcategory1': {
        'category': 'category1',
        'type': 'type1'
    },
    'subcategory2': {
        'category': 'category1',
        'type': 'type1'
    },
    'subcategory3': {
        'category': 'category2',
        'type': 'type2'
    }
}

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

有什么建议吗?

提前致谢

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

你可以通过在 运行 mypy 之前添加行 reveal_type(my_dict) 来自己确认。 (Mypy special-cases 帮助调试的那个函数名)。推断的类型最终是 Dict[str, object],或者类似的东西。

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

from typing import Dict, List

my_dict: Dict[str, Dict[str, List[str]]] = { ... }

如果您使用的是 Python 的早期版本,请使用 comment-based 语法注释变量。