我有一本字典用作我的“配置”。我不改变价值观,所以它可能是不可变的。我通过键索引使用它的值作为函数的参数,如下所示:
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
的方法?也许首先使用真正不可变的数据类型?
使用 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"])