尝试在Python代码中使用静态类型,因此mypy
可以帮助我解决一些隐藏的错误。使用单个变量非常简单
real_hour: int = lower_hour + hour_iterator
很难与列表和字典一起使用它,需要导入其他
typing
库:from typing import Dict, List
hour_dict: Dict[str, str] = {"test_key": "test_value"}
但是主要的问题-如何将其与具有不同值类型的Dicts结合使用,例如:
hour_dict = {"test_key": "test_value", "test_keywords": ["test_1","test_2"]}
如果我不对此类词典使用静态类型-mypy会向我显示错误,例如:
len(hour_dict['test_keywords'])
- Argument 1 to "len" has incompatible type
所以,我的问题是:如何向此类词典添加静态类型? :)
最佳答案
您需要某种Union
类型。
from typing import Dict, List, Union
# simple str values
hour_dict: Dict[str, str] = {"test_key": "test_value"}
# more complex values
hour_dict1: Dict[str, Union[str, List[str]]] = {
"test_key": "test_value",
"test_keywords": ["test_1","test_2"]
}
通常,当您需要“此或那个”时,您需要一个
Union
。在这种情况下,您的选项是str
和List[str]
。有几种方法可以解决这个问题。例如,您可能想定义类型名称以简化内联类型。
OneOrManyStrings = Union[str, List[str]]
hour_dict2: Dict[str, OneOrManyStrings] = {
"test_key": "test_value",
"test_keywords": ["test_1","test_2"]
}
我可能还会建议您保持简单性,并行性和规则性,即使只有一项,也要使所有
dict
值成为纯List[str]
。这将允许您始终获取值的len()
,而无需事先进行类型检查或保护条件。但是这些要点是细微的调整。关于python - 如何在Python 3.6中使用具有不同值类型的Dict使用静态类型检查?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48013561/