The Theory of Type Hinting

09 January 2015

原文地址

概述

这篇文档列举了为 Python 3.5 提出的新的类型约束的理论. 它并不是完整的提议或规范因为很多细节还需要讨论. 但是它奠定了理论基础, 没有理论的话很难去讨论更具体的规范. 我们从解释进阶类型(gradual typing)开始; 然后我们说明一些约定和基本规则; 然后我们定义新的特殊类型(例如 Union), 这些类型可以在注释中使用; 最后我们定义泛型类型的方法.(后一部分需要进一步充实; 抱歉!)

进阶类型综述

我们定义一个新的关系, 与…一致(is-consistent-with), 它和是…的子类(is-subclass-of)类似, 除了在涉及新类型Any的时候它是未传递的.(这两种关系都不是对称的.) 如果 x 的类型和 y 的类型一致那么把 x 赋值给 y 是可以的. (和”如果 x 的类型是 y 的子类”对比, 它声明了面向对象编程的基础之一.) 这个 is-consistent-with 关系由三条规则定义:

  1. 如果 t1 是 t2 的子类那么 t1 的类型与 t2 一致.(但反过来不是.)
  2. Any 与任意类型一致.(但是 Any 不是任何类型的子类.)
  3. 任意类型都是 Any 的子类.(这使得任意类型都与 Any 一致, 根据规则1.)

就是这些! 可以看 Jeremy Siek 的博文 What is Gradual Typing 来获得更长的解释. 注意规则3把 Any 放在了这个类图的根部. 这使得它和对象(object)非常相似. 不同之处是对象不和大部分类型一致(e.g. 当需要一个 int 的时候你就不能使用一个 object() 实例). 换句话说, Anyobject 都意味着”允许任意类型”当它们被用来注释参数的时候, 但是只有 Any 可以被传给任意期望类型(在本质上, Any 关闭了静态检查的报错).

这里有一个例子展示实际中这些规则是怎么使用的:

符号约定

一般规则

类型

我们可能会增加:

语用

一些和理论不相干的东西但是使得实际使用更加方便.(这不是完整的列表; 我可能掉了一点并且有些还有争论或者没有完全确定.)

泛型类型

(TODO: 解释更多. 参考mypy docs on generics.)

预定义的泛型类型以及 TYPING.PY 中的协议

(参考mypy typing.py module)

标签:
  • Python
comments powered by Disqus