【问题标题】:Python: Type Annotations, how to define elements of a tuple?Python:类型注释,如何定义元组的元素?
【发布时间】:2015-01-30 18:10:56
【问题描述】:

这是一个最小的例子。

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) 

【问题讨论】:

  • 看相关的PEP,最近发展了不少。如果您真的很好奇,您还可以查看python-ideas list archives,Guido 在 2015 年 1 月中旬开始了关于此 PEP 的主题。
  • 从 python 3.9 PEP 585 我们可以写 tuple[int, int]

标签: python static-typing type-annotation


【解决方案1】:

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

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

注意:python 运行时不会抱怨-> (int, int),但根据 PEP 484,它不是正确的类型注释。换句话说,如果你想使用 type 创建你的迷你语言,你可以使用它出于您自己的目的的提示;但它不被 python 类型标准 (PEP 484) 接受。

【讨论】:

  • 如何注释[[str, int]] ?尽管元素 [str, int]List[Tuple[str,int]] 这样的列表,我可以使用元组吗?
  • @qrtLs 不,你不能。 Python 类型注解只能表示所有项目都具有相同类型的列表。没有办法说my_list 是一个包含strint 类型的两个项目的列表。基本原理:一个变量不能改变它的类型,而且对于一个列表来说改变它的长度太常见了。如果长度可以改变,并且项目的类型不同,那么当用户尝试将int 附加到List[int, str] 时,类型系统应该做什么就不清楚了。选择的解决方案是你根本不能指定长度,并且所有项目的类型必须相同。
  • @qrtLs 但是你可以并且也许应该在你的返回值中使用一个实际的元组:如果列表总是两个元素,并且它们总是具有相同的类型,为什么它是一个列表吗?为了使接收它的函数更容易对其进行变异?在你的情况下,这是一个足够有力的理由吗?
  • 从 python 3.9 PEP 585 我们可以写 tuple[int, int]
【解决方案2】:

不,目前还没有规范的方法来执行此操作。 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)

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

【讨论】:

  • 我仍然希望实际的输入和返回类型会在某个时候被强制执行,而不是仅仅作为一种花哨的注释语法。
  • 呃,我对此不是很渴望。它违背了 Python 动态类型的目的,并破坏了该语言的一个重要特性。我的意思是,如果你想要静态类型,为什么不使用 Java 或 C++(它们通常都更快)? Python 很棒,因为它是动态的。当然,这只是我的看法。 :)
  • 我应该澄清一下,我的意思只是强制执行(在带注释的代码上)——我可以写 def foo() -> int: 并返回 str 对我来说真的很奇怪;当然,这可能不会经常发生;但def foo() -> int 可能会返回float
  • 鉴于 PEP 484 的最新发展,这个答案可能有点过时了。请参阅我对 OP 问题的评论。
  • @user3467349:我们知道,Python 永远不会强制执行静态类型。这不是 Python 是什么。如果您关注 Python 的开发,您会发自内心地感受到 Guido 和核心开发人员是多么坚定地认为这些是 注解不是 声明。但是,如果你喜欢静态类型,或者甚至是具有可选的、精心挑选的静态类型的混合系统,那么除了 Python,你还有其他选择。最容易想到的两个是 Cython 和 Nim(以前的 Nimrod),而且他们绝不是唯一的。
猜你喜欢
  • 2019-07-11
  • 1970-01-01
  • 1970-01-01
  • 2017-03-31
  • 1970-01-01
  • 1970-01-01
  • 2015-04-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多