Mypy 抱怨“in (“object”) 不支持右操作数类型,并且“object”没有属性“get”,但解释器运行良好?

问题描述 投票:0回答:1

我正在运行一些非常简单的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"

任何帮助将不胜感激!

python mypy
1个回答
0
投票

这里的问题是

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
© www.soinside.com 2019 - 2024. All rights reserved.