翻译Python历史:Python对动态类型的使用

This post a a Chinese translation of Guido van Rossums‘s article “Python’s Use of Dynamic Typing” on his blog named “The History of Python“.

原文地址:http://python-history.blogspot.com/2009/02/pythons-use-of-dynamic-typing.html

ABC和Python间一项重要的区别是类型系统的总体特点不同。ABC是静态类型语言,意味着ABC编译器分析程序中使用的类型并判断它们被正确的使用。如果不是,程序会被拒绝并无法运行。不像今天多数静态类型语言那样,ABC使用类型推断(像Haskell那样)而不是像你在C之类的语言中看到的显式的类型声明那样。相反的,Python是动态类型语言。Python编译器高兴的对程序中类型的使用不感兴趣,所有的类型检查都在运行的时候进行。

尽管这样看上去对于ABC是一种很大的远离,但它并不如你想象的那样不同。不像其它静态类型语言,ABC不是(不曾是?它在今天确实已经是纯历史了:-))仅仅依赖于静态类型检查来确保程序不崩溃,当所有的操作执行时,它有运行期的库来为它们再次检查参数类型。这样做是因为编译器健全的类型检查算法的一部分在最初的语言原型实现中并没有被实现。运行期的库在调式的时候同样有用,因为显式的运行期类型检查可以产生漂亮的错误信息(指向实现团队),而不是解释器毫不检查参数时就盲目的运行而引起的core dump。

然而,ABC在静态类型检查外同时拥有运行期类型检查的最重要的原因是它是交互式的。在交互会话时,用户输入的ABC指令和定义在输入完成后就马上执行。在交互会话时,有可能会生成一个数字变量,删除它,然后再重新把它创建(换句话说,生成另一个有相同值的变量)成字符串。在一个单一子程序中,让一个相同的变量名先成为数字然后成为字符串是一个静态类型错误,但在交互会话中强制在不同的输入的指令里做这种类型检查并不合理,因为偶然创建的名为x的数字变量后边永远不能再用x用作其它不同类型的变量了!所以作为妥协,ABC对全局变量用了动态类型检查,但对局部变量用静态类型检查。为了简化实现,局部变量也是动态检查的。

因此,从ABC的类型检查实现方案到Python的方案只有一小步──Python简单的完全去掉了编译期类型检查。这完全符合Python的”切角”哲学,原因是如此精简实现不会引起安全问题,因为所有类型错误都在运行期中他们引起Python解释器发生故障前被捕获。

然而,一旦你决定了使用动态类型就没有回头路了。ABC的内建操作小心设计以便参数的类型可以从操作中推导出来。例如,在表达式”x^y”里编译器会推导出变量x和y是字符串,表达式的结果也是。在Python中,这样的推导基本上不能实现。例如,表达式”x+y”可能是字符串连接、数字相加、或者执行用户重载的操作。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据