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 语法注释变量。
我肯定不是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 语法注释变量。