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

fru*_*ard 11 python typing python-3.5

我正在使用新的Python 3.5模块输入,它很高兴.

我想知道如何根据精确的字符串文字指定类型.例如,函数保证返回四个字符串中的一个 - "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'
Run Code Online (Sandbox Code Playgroud)

而不是仅仅恢复str,我想回到一个更具体的类型,它是四个值之一- ,"I","II","III""IV".

在Typescript中,人们可以做到:type Quadrant = "I" | "II" | "III" | "IV"- 这个typing模块的用例是否有任何不错的Python糖?

小智 4

忽略typing您询问的模块,解决您问题的一种方法可能是使用Enum多个注释中假设的 an 。其代码如下所示:

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'>
Run Code Online (Sandbox Code Playgroud)

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

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