我正在使用新的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糖吗?
答案 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
的有效返回值的行为。这应该手动处理。