Python: Type Annotations,如何定义元组的元素?

Python: Type Annotations, how to define elements of a tuple?

这是一个最小的案例。

def foo(x:int, y:int) -> tuple: 
    return (x*y, y//2)

能够编写 -> tuple(:int, :int) 是非常诱人的,它不是一种有效的格式。在这种情况下是否有正确的方法,或者在 python 进一步沿着类型注释道路移动之前它仍然是一个灰色区域?

编辑: 显然可以做类似的事情

def bar(x, y) -> ((str, int), (str, int)): 
     return ("%s+%s" %(x,y), x+y), ("%s-%s" %(x,y), x-y) 

不,目前还没有规范的方法可以做到这一点。 Python 类型注释是该语言的一个相对较新的补充,因此它们仍有一定的局限性。

现在,您可以使用元组文字:

def foo(x:int, y:int) -> (int, int):
    return (x*y, y//2)

那个,或者一个字符串文字,例如:

def foo(x:int, y:int) -> 'tuple(int, int)':
    return (x*y, y//2)

这两个都非常清楚地表达了您的意图。

现在有一种方法可以注释这种情况:

from typing import Tuple
def foo(x:int, y:int) -> Tuple[int, int]: 
    return (x*y, y//2)

注意:python 运行-时间不会报错-> (int, int),但根据PEP 484,它不是正确的类型注解。换句话说,你可以使用它如果你想为自己的目的使用类型提示创建你的迷你语言;但 python 打字标准 (PEP 484) 不接受它。