Guido van Rossum,最著名的Python编程语言设计师,最近在python-ideas邮件列表上发送了一个提案,该提案旨在为Python函数声明添加类型注释。该提案旨在为Python提供静态类型提供的好处,而不会改变Python的动态类型性质和解释器行为。
目的是使向第3方模块(甚至stdlib)添加类型检查注释成为可能,同时允许(未修改的)Python 3.5解释器不变地执行程序
Guido关于添加类型注释的建议基于Bob Ippolito的想法,Bob Ippolito主张将Haskell的某些功能引入Python和其他语言。还有mypy的作者Jukka Lehtosalo,mypy是一种实验性的Python变体,旨在结合动态键入和静态键入的优点。
Mypy是Guido建议中的核心部分。Guido说,的确,mypy可以看作是用于Python的类似于棉绒的静态检查器,可用于在编译时或在mypy Python解释器中运行程序时检查程序的类型正确性。另一方面,在Python官方解释器下运行时,程序执行将不受类型注释的影响,因此不会产生运行时类型检查开销。做到这一点的关键要求是,用于类型注释的语法必须是有效的Python 3语法,这是mypy的功能之一。实际上,mypy使用函数注释(一种Python 3语法,用于向函数添加任意元数据注释)来指定类型签名。
作为mypy基本语法的示例,以下Python定义:
def fib(n):
a,b = 0,1
而<n:
打印(a)
a,b = b,a + b
可以在mypy中进行修改以指定类型签名:
def fib(n:int)->无:
a,b = 0,1
而<n:
打印(a)
a,b = b,a + b
如果没有合适的Python语法指定类型,mypy会使用注释,例如Guido van Rossum在其建议中提供的以下示例:
def word_count(input:List [str])-> Dict [str,int]:
结果= {} #type:Dict [str,int]
输入中的行:
对于line.split()中的单词:
result [word] = result.get(word,0)+ 1
返回结果
考虑到所有这些,Guido建议可以为Python 3.5及时编写,接受和实现PEP。这将需要两个主要工作分支:
重新评估功能注释的定义,以限制其用于类型注释。
提供有关要添加到Python 3.5的规范,Guido建议将其最小化。
实际的类型检查器不会与Python解释器集成,也不会被检查到CPython存储库中。唯一需要添加到stdlib的是mypytyping.py模块的副本。该模块定义了数十个新类(以及一些装饰器和其他帮助器),可用于表达参数类型。如果要对代码进行类型检查,则必须下载并安装mypy并单独运行它。
Guido的建议引起了人们对Python想法邮件列表和reddit的兴趣。除了一些贡献者对该讨论的积极反应之外,人们还提出了有关将函数注释限制为类型签名规范以及使用注释来传达类型定义的担忧。
关注 CDA人工智能学院 ,回复“录播”获取更多人工智能精选直播视频!