mypy和嵌套的词典理解

时间:2018-03-28 11:29:45

标签: python list-comprehension dictionary-comprehension mypy

我绝对不是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"')引用了上一行。

有什么建议吗?

提前致谢

1 个答案:

答案 0 :(得分:1)

问题是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]]] = { ... }

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