Python设计错误

42 投票
13 回答
12718 浏览
提问于 2025-04-16 09:26

不久前,当我在学习Javascript的时候,我读了一本叫做《Javascript: the good parts》的书,特别喜欢里面关于糟糕和丑陋部分的章节。当然,我并不是完全同意书中的所有观点,因为总结一门编程语言的设计缺陷在某种程度上是主观的——不过,比如说,大家应该都同意在Javascript中使用with这个关键词是个错误。尽管如此,我觉得阅读这样的评论还是很有用的:即使不完全同意,里面也有很多可以学习的东西。

有没有关于Python设计缺陷的博客文章或者书籍呢?比如,有些人可能会认为缺少尾调用优化是个错误;还有其他一些问题(或者不算问题的事情)也是值得了解的。

13 个回答

23

我对Python最大的烦恼之一,就是在标准库中缺乏合适的命名规则,而这个问题在3.x版本中并没有得到解决。

比如说,为什么datetime模块里有一个类也叫datetime呢?(更别提为什么我们有单独的datetimetime模块,但又有一个datetime.time类!)还有,为什么datetime.datetime是小写的,而decimal.Decimal却是大写的?请告诉我,为什么在xml这个命名空间下会有这么混乱的情况:xml.saxxml.etree.ElementTree,这到底是怎么回事?

33

有没有关于Python设计错误的博客或者书籍推荐?

有的。

这个列表叫做Py3K,里面列出了与之前版本不兼容的变化。

你可以从这里开始了解:http://docs.python.org/release/3.0.1/whatsnew/3.0.html

想了解更多关于Python 2中的错误,可以查看所有Python 3.x的发布说明。

33

你问有没有链接或者其他来源,但其实没有。相关的信息分散在很多地方。什么算是设计上的错误呢?是仅仅指语言定义中的语法和语义问题,还是包括平台、标准库的问题以及具体实现的问题?从性能的角度来看,可以说Python的动态特性是个设计上的错误,因为这让实现一个简单高效的版本变得困难,也让开发带有代码补全、重构等功能的IDE变得复杂(我并不是说完全不可能)。同时,你也可以为动态语言的优点辩护。

一个思考这个问题的方式是看看Python 2.x到3.x的语言变化。有些人会觉得print变成一个函数不太方便,而另一些人则认为这是个改进。总体来说,变化不算太多,大部分都很小且微妙。例如,map()filter()返回的是迭代器而不是列表,range()的行为像以前的xrange(),而dict的方法像dict.keys()返回的是视图而不是列表。还有一些与整数相关的变化,其中一个大变化是二进制/字符串数据的处理。现在有了文本数据的区分,文本总是Unicode格式。虽然有一些语法上的变化,但更多的是为了保持一致性,而不是彻底改造整个语言。

从这个角度看,自2.x以来,Python在语言(语法和语义)层面上设计得相当不错。关于基于缩进的代码块语法,你总是可以争论,但大家都知道这没什么意义... ;-)

另一种思考方式是看看其他Python实现试图解决什么问题。大多数实现都在某种程度上关注性能,有些解决平台问题,还有一些对语言本身进行修改,以更高效地完成某些任务。Unladen Swallow希望通过优化运行时的字节编译和执行阶段来显著提高Python的速度。Stackless通过增加微线程和任务等结构,为高效的多线程应用添加功能,允许双向任务通信的通道,调度任务以协作或抢占式运行,以及序列化以暂停和恢复任务执行。Jython允许在Java平台上使用Python,而IronPython则在.Net平台上使用。Cython是一种Python方言,允许调用C函数和声明C类型,从而让编译器能够从Cython代码生成高效的C代码。Shed Skin为Python引入了隐式静态类型,并为独立程序或扩展模块生成C++代码。PyPy在Python的一个子集上实现了Python,并改变了一些实现细节,比如引入垃圾回收而不是引用计数。这样做的目的是让Python语言和实现的开发变得更高效。Py V8通过V8 JavaScript引擎将Python和JavaScript连接起来——可以说这是在解决一个平台问题。Psyco是一种特殊的即时编译器(JIT),它动态生成针对当前处理数据的运行代码的特殊版本,这样可以在不编写优化的C模块的情况下加速你的Python代码。

通过查看PEP-3146,我们可以了解到Python当前的状态,这个PEP概述了Unladen Swallow将如何合并到CPython中。这个PEP已经被接受,因此是Python开发者对目前最可行方向的判断。请注意,它关注的是性能,而不是语言本身。

所以我认为,Python主要的设计问题在于性能领域——但这些基本上是任何动态语言都必须面对的挑战,而Python家族的语言和实现正在努力解决这些问题。至于像Javascript: the good parts中列出的那些明显的设计错误,我觉得“错误”的定义需要更明确,但你可以看看以下内容以获取一些想法和观点:

撰写回答