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。这应该手动处理。
| 归档时间: |
|
| 查看次数: |
980 次 |
| 最近记录: |