Python:类型注释,如何定义元组的元素?

Python:类型注释,如何定义元组的元素?,python,static-typing,type-annotation,Python,Static Typing,Type Annotation,这是一个很小的例子 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

这是一个很小的例子

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)不接受它。

我仍然希望实际的输入和返回类型在某个时候会被强制执行,而不仅仅是作为一种花哨的注释语法。呃,我不太希望这样。它违背了Python动态类型的目的,破坏了该语言的一个重要特性。如果你想要静态类型,为什么不使用java或者C++(它们通常都更快)?Python之所以伟大是因为它是动态的。当然,这只是我的意见。:)我应该澄清一下,我只是指强制执行(在带注释的代码上)——我真的很奇怪,我可以编写
def foo()->int:
并返回
str
;假设这种情况不经常发生;但是
def foo()->int
返回一个
float
可能会返回。鉴于PEP 484的最新发展,这个答案可能有点过时。请参阅我对OP问题的评论。@user3467349:Python,正如我们所知,永远不会强制使用静态类型。这不是Python的本质。如果您关注Python的开发,您会本能地感觉到Guido和核心开发人员是多么坚定地认为这些是注释,而不是声明。但是,如果您喜欢静态类型,或者甚至是具有可选的、cherry挑选的静态类型的混合系统,那么除了Python之外,您还有其他选择。最快浮现在脑海中的两个是Cython和Nim(以前叫Nimrod),他们并不是唯一的两个。参见相关的,最近有了很多发展。如果你真的很好奇,你也可以去看看,Guido在2015年1月中旬开始了一个关于这个PEP的线程。从python 3.9开始,我们可以编写tuple[int,int]如何注释
[[str,int]]
?尽管元素
[str,int]
列表[Tuple[str,int]]]
类似,但我是否可以使用Tuple?@qrtLs不可以。Python类型注释只能表示所有项都具有相同类型的列表。没有办法说
my_list
是一个包含两项类型的列表
str
int
。理由:变量不能更改其类型,而且对于列表来说,更改其长度太常见了。如果长度可以改变,并且项目的类型不相同,那么当用户试图在
列表[int,str]
中添加一个
int
时,类型系统应该做什么就不清楚了。选择的解决方案是,您根本无法指定长度,并且所有项的类型必须相同。@qrtLs但您可以而且可能应该在返回值中使用实际的元组:如果列表始终是两个元素,并且它们始终具有相同的类型,为什么要以列表开头?使接收它的函数更容易对其进行变异?在你的例子中,这是一个足够有力的理由。因为Python3.9,我们可以编写tuple[int,int]