Python编程语言的设计者Guido van Rossum,最近在python-ideas邮件列表中提出了一个建议:在Python函数声明中加入类型注释。这个建议旨在在不改变Python动态类型的本质和解释器行为的前提下,让Python获得静态类型系统所带来的好处。
Guido所提出的添加类型注释的建议源自于Bob Ippolito和Jukka Lehtosalo的想法。Bob Ippolito主张将Haskell的一些特性引入到Python和其他语言中。Jukka Lehtosalo则是mypy的作者,这是一个带有试验性质的Python变种版本,旨在将动态类型和静态类型的好处结合起来。 Mypy是Guido建议中的主要内容。在建议中,Guido说到,可以将mypy看成一个用于Python的、类似lint的 静态检查器。用于在编译期或是在mypy的Python解释器下运行时,检查程序中类型的正确性。另一方面,程序在Python官方的解释器下执行时,能 够不受类型注释的影响。因此也不会有运行时类型检查的开销。为了达到这一点,关键在于用于类型注释的语法必须符合Python 3的语法。这也是mypy的一个特性。实际上,mypy在指定类型签名的时候使用了函数注释这个Python 3的语法。该语法允许为函数添加任意元数据注释。 作为一个mypy基本语义的例子,以下的Python定义: def fib(n):
a, b = 0, 1
while a < n:
print(a)
a, b = b, a+b
在mypy中可以稍加修改以指定一个类型签名 def fib(n: int) -> None:
a, b = 0, 1
while a < n:
print(a)
a, b = b, a+b
万一没有合适的Python语法能够指定某个类型,那mypy可以使用注解的方式。Guido van Rossum在他的建议里提供了一个这样的例子: def word_count(input: List[str]) -> Dict[str, int]:
result = {} #type: Dict[str, int]
for line in input:
for word in line.split():
result[word] = result.get(word, 0) + 1
return result
鉴于所有这一切,Guido建议可以及时地为Python 3.5编写,采用和实施一份PEP。这需要完成两项工作:
Guido的建议在Python-ideas邮件列表和reddit上都引起了一些人的兴趣。除了有一些代码贡献者在讨论中表示出积极的反应外。将函数注释限制用于类型签名的指定和使用注解表达类型定义引起了一些人的担心。 查看英文原文:Guido van Rossum Wants to Bring Type Annotations to Python |