BT

如何利用碎片时间提升技术认知与能力? 点击获取答案

Guido van Rossum想要在Python中加入类型注释

| 作者 Sergio De Simone 关注 13 他的粉丝 ,译者 潘瑾瑜 关注 0 他的粉丝 发布于 2014年8月21日. 估计阅读时间: 5 分钟 | 如何结合区块链技术,帮助企业降本增效?让我们深度了解几个成功的案例。

Python编程语言的设计者Guido van Rossum,最近在python-ideas邮件列表中提出了一个建议:在Python函数声明中加入类型注释。这个建议旨在在不改变Python动态类型的本质和解释器行为的前提下,让Python获得静态类型系统所带来的好处。

其目标是,在不改变程序执行逻辑的情况下,通过(未修改的)Python 3.5解释器运行时,能够对第三方模块(甚至是stdlib)添加类型检查注释。

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。这需要完成两项工作:

  • 重新考虑函数注释的定义,将它的使用限制于类型注释。

  • 为需要加入Python 3.5的内容制定一个规范。Guido建议添加的东西应越少越好。

实际的类型检查器不会被集成进Python解释器,也不会被签入CPython代码库中。唯一需要做的是在stdlib中加入一份mypy的typing.py模块的拷贝。这个模块定义了许多新的类(还有一些装饰器和辅助函数)。这些类可以用于表示参数的类型。如果你想要对代码进行类型检查,你需要下载和安装mypy,并单独地运行它。

Guido的建议在Python-ideas邮件列表和reddit上都引起了一些人的兴趣。除了有一些代码贡献者在讨论中表示出积极的反应外。将函数注释限制用于类型签名的指定和使用注解表达类型定义引起了一些人的担心。

查看英文原文:Guido van Rossum Wants to Bring Type Annotations to Python


感谢邵思华对本文的审校。

给InfoQ中文站投稿或者参与内容翻译工作,请邮件至editors@cn.infoq.com。也欢迎大家通过新浪微博(@InfoQ)或者腾讯微博(@InfoQ)关注我们,并与我们的编辑和其他读者朋友交流。

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

期待 by Fang Yonka

期待半静态化py

期待 by Fang Yonka

期待半静态化py

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

2 讨论

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT