mypy 无法推断字典值的类型:仍然将其用作函数参数的干净方法是什么?

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

我有一本字典用作我的“配置”。我不改变价值观,所以它可能是不可变的。我通过键索引使用它的值作为函数的参数,如下所示:

from typing import Union

my_config: dict[str, Union[int, float, str]] = {
    "timeout": 60,
    "precision": 3.14,
    "greeting": "Hello",
}

def my_function(arg: int):
    print(f"The value is: {arg}")

my_function(arg=my_config["timeout"])

由于 mypy 是静态类型检查器,因此它无法推断字典内的类型。所以它会抱怨:

“my_function”的参数“arg”具有不兼容的类型“Union[int, float, str]”;预期“int”

处理这种情况的正确方法是什么?一些想法:

from typing import cast
# type cast before call
my_function(arg=int(my_dict["key1"]))
my_function(arg=cast(int, my_dict["key1"]))

还有更多吗?处理这个问题的首选方法是什么?我是否必须后退一步并改变使用 dict 来实现

my_config
的方法?也许首先使用真正不可变的数据类型?

python mypy python-typing
1个回答
0
投票

使用 cast 可以满足 mypy 的要求,但显然,它对运行时检查没有帮助。

如果您确实想确保您的函数已传递适当的类型,那么您必须编写将在运行时测试的代码。

类似这样的:

type DVAL = int|float|str

my_config: dict[str, DVAL] = {
    "timeout": 60,
    "precision": 3.14,
    "greeting": "Hello",
}

def my_function(arg: DVAL):
    if isinstance(arg, int):
        print(f"The value is: {arg} with type int")
    else:
        raise TypeError("Expected int")

my_function(my_config["timeout"])
© www.soinside.com 2019 - 2024. All rights reserved.