尝试在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。在这种情况下,您的选项是strList[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/

10-12 20:26
查看更多