输入模块 - 字符串文字类型

时间:2016-10-05 20:24:01

标签: python python-3.5 typing

我正在使用新的Python 3.5模块typing并且它非常高兴。

我想知道如何根据精确的字符串文字指定类型。例如,保证函数返回四个字符串中的一个 - " North"," West"," East"," South - 怎么能我们将其表示为特定的类型变量,而不仅仅是str

我查看了文档,查找了Union类型和TypeVar函数,但无法找到答案。

表达此问题的示例函数:

def compute_quadrant(x: int, y: int) -> str:
    if x > 0 and y > 0:
        return 'I'
    elif x < 0 and y > 0:
        return 'II'
    elif x < 0 and y < 0:
        return 'III'
    elif x > 0 and y < 0:
        return 'IV'

我不想仅仅返回str,而是希望返回一个更具体的类型,即四个值之一 - "I""II""III" ,或"IV"

在Typescript中,可以这样做:type Quadrant = "I" | "II" | "III" | "IV" - 对于typing模块的这个用例,有什么好的Python糖吗?

1 个答案:

答案 0 :(得分:1)

忽略您询问的typing模块,问题的一个解决方案可能是在多个评论中使用Enum。这个代码看起来像这样:

from enum import Enum

class Quadrant(Enum):
    I = 1
    II = 2
    III = 3
    IV = 4

def compute_quadrant(x: int, y: int) -> Quadrant:
    if x > 0 and y > 0:
        return Quadrant.I
    elif x < 0 and y > 0:
        return Quadrant.II
    elif x < 0 and y < 0:
        return Quadrant.III
    elif x > 0 and y < 0:
        return Quadrant.IV
    # return None  # this is what happens without an else clause!

if __name__ == "__main__":
    quad = compute_quadrant(1, -1)
    print(quad, type(quad))              # -> Quadrant.IV <enum 'Quadrant'>
    print(quad.name, type(quad.name))    # -> IV <class 'str'>
    print(quad.value, type(quad.value))  # -> 4 <class 'int'>

如您所见,您可以使用Enums名称和值。该名称是您要求的字符串之一。

我在这里看到的一个问题是函数中缺少的else子句以及mypy当前接受None作为Quadrant的有效返回值的行为。这应该手动处理。