写点什么

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

  • 2014-08-20
  • 本文字数:1331 字

    阅读完需:约 4 分钟

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 )关注我们,并与我们的编辑和其他读者朋友交流。

2014-08-20 05:262504

评论

发布
暂无评论
发现更多内容

容器化 | ClickHouse on K8s 基础篇

RadonDB

数据库 Kubernetes Clickhouse

数字人民币专利数激增, “区块链”领域大有可为

CECBC

插上NIO翅膀,FunTester飞上天

FunTester

nio 性能测试 接口测试 测试框架 FunTester

架构实战营模块五作业

maybe

经济学人:若比特币价格清零会怎样?

CECBC

八家知名大厂联合手写的Java面试手册刚上线!竟就到达巅峰?

Java~~~

Java 架构 面试 JVM 多线程

还不了解 static ?年轻人,劝你耗子尾汁...

神策技术社区

数据分析 大前端 后端 埋点

Activity之间跳转时,生命周期的变化

W🌥

android 8月日更

当知识图谱遇上预训练语言模型

博文视点Broadview

浅析fil:fil未来价值到底在哪?

区块链 分布式存储 IPFS fil FIL价值

activiti整合在现有系统,业务绑定,流程在线设计@附源码

金陵老街

2021 年 iOS 应用程序开发七种最佳语言

iOSer

Java flutter ios objective-c swift

python——execl写入数据2

YUKI0506

2021 OceanBase 数据库大赛来袭!邀你改编世界,码出未来

OceanBase 数据库

数据库 oceanbase OceanBase 开源 OceanBase 社区版 OceanBase 数据库大赛

「最好」的敌人是「好」

非著名程序员

提升认知 认知提升 个人提升 8月日更

ipfs挖矿是怎样赚钱的?ipfs挖矿值得投资吗?

IPFS挖矿值得投资吗 IPFS挖矿是怎样赚钱的

基于springcloud springboot vue elementui商城源码毕设实战

清风

Vue Java 分布式 毕业设计

CODING DevOps 高级架构师王炜入选木兰开源社区首批导师

CODING DevOps

DevOps Nocalhost 木兰开源社区 开发者生态

牛客网论坛最具争议的Java面试成神笔记,GitHub已下载量已过百万

Java~~~

Java 架构 面试 算法 架构师

DAPP去中心化交易所开发|DAPP与APP的区别

Geek_23f0c3

交易所开发 去中心化交易所系统开发 DAPP智能合约交易系统开发

ipfs矿机公司实力排行如何?ipfs矿机排名如何?

ipfs矿机公司实力排行如何 ipfs矿机排名如何

GIT远程仓库

一个大红包

8月日更

金融助力补链强链 科技发挥关键作用

CECBC

python——利用tkinter制作可视化窗体1

YUKI0506

容器化 | ClickHouse on K8s 部署篇【建议收藏】

RadonDB

数据库 Kubernetes Clickhouse

为什么你的数据总是丢?

神策技术社区

数据分析 大前端 后端 埋点

OceanBase数据库源码解读之模块结构

OceanBase 数据库

数据库 分布式数据库 oceanbase OceanBase 开源 OceanBase 社区版

神策分析 iOS SDK 全埋点解析之元素点击与页面浏览

神策技术社区

大前端 后端 数据 埋点

python3学习笔记-20210817(变量名与字符串)

姬翔

微服务架构师-docker私有镜像仓库的配置和使用

学神来啦

Linux 容器 微服务 运维 架构师

上游思维:在系统的关键处找一个支点

石云升

读书笔记 8月日更 上游思维

Guido van Rossum想要在Python中加入类型注释_Python_Sergio De Simone_InfoQ精选文章