我正在运行一些非常简单的Python代码,我不明白为什么mypy会抱怨它。我对使用Python有点陌生,所以也许这是显而易见的,但我没有太多运气。
我有这个字典:
DEFAULTS = {
"environments": {
"beta": {
"level": 10
},
"prod": {
"level": 20
}
},
"contact": {
"username": "blah",
"type": "test",
"name": "blah2"
}
}
如果我把它放在解释器中并在控制台中弄乱它,我可以做类似的事情
stage = # get stage from somewhere
if stage in DEFAULTS.get("environments"):
# Do something
但是如果我在“真实”代码中做同样的事情,我会收到一个 mypy 错误:
error: Unsupported right operand type for in ("object")
.
同样,如果我尝试这样做:
something = DEFAULTS.get("contact").get("username")
,我的翻译工作得很好,但 mypy 说 error: "object" has no attribute "get"
任何帮助将不胜感激!
这里的问题是
mypy
无法推断 DEFAULT
字典中项目的类型,因此它假设 DEFAULT
包含对象,而您无法对其应用 in
运算符。
将显式类型添加到
DEFAULT
字典的声明中,并检查 DEFAULT.get()
的返回类型是否应该修复它。
from typing import Dict, Union
DEFAULTS:Dict[str, Dict[str, Union[str, Dict[str, int]]]] = {
"environments": {
"beta": {
"level": 10
},
"prod": {
"level": 20
}
},
"contact": {
"username": "blah",
"type": "test",
"name": "blah2"
}
}
default_env = DEFAULTS.get("environments")
stage = # get stage from somewhere
if default_env is not None and stage in default_env:
# Do something