Python设计错误

And*_*rea 41 python

不久前,当我学习Javascript时,我研究了Javascript:好的部分,我特别喜欢关于坏和丑陋部分的章节.当然,我并不同意所有内容,因为总结编程语言的设计缺陷在某种程度上是主观的 - 尽管如此,我想每个人都会同意这个关键字with在Javascript中是个错误.尽管如此,我发现阅读此类评论很有用:即使有人不同意,也有很多需要学习的地方.

是否有博客文章或一些描述Python设计错误的书籍?例如,我猜有些人会认为缺少尾调优化是一个错误; 可能还有其他值得学习的问题(或非问题).

Fab*_*olm 33

您要求提供链接或其他来源,但确实没有.信息分布在许多不同的地方.究竟是什么构成了设计错误,您是否只计算语言定义中的语法和语义问题,还是包括平台和标准库问题以及具体实现问题等实用主题?从性能的角度来看,你可以说Python的动态是一个设计错误,因为它使得很难做出直接有效的实现,并且使得用代码完成,重构的IDE变得困难(我并不是说完全不可能)和其他好东西.与此同时,你可以争论动态语言的优点.

也许一种开始考虑这个问题的方法是查看从Python 2.x到3.x的语言变化.有些人当然会争辩说,print作为一种功能是不方便的,而其他人则认为这是一种改进.总的来说,没有那么多变化,而且大多数都变得非常小而微妙.例如,map()以及filter()返回迭代器而不是列表,range()行为就像xrange()习惯了,和dict方法,如dict.keys()回报的观点,而不是名单.然后有一些与整数相关的变化,其中一个重大变化是二进制/字符串数据处理.它现在是文本数据,文本始终是Unicode.有几种语法上的变化,但它们更多地是关于一致性而不是改进整个语言.

从这个角度来看,似乎Python已经在语言(语法和语义)级别上设计得非常好,因为至少2.x. 您总是可以争论基于缩进的块语法,但我们都知道这不会导致任何地方... ;-)

另一种方法是查看替代Python实现正在尝试解决的问题.它们中的大多数以某种方式处理性能,一些解决平台问题,一些语言本身添加或更改以更有效地解决某些类型的任务.Unladen swallow希望通过优化运行时字节编译和执行阶段来显着加快Python的速度.Stackless通过添加微线程和tasklet等构造,允许双向tasklet通信的通道,协同或抢先运行tasklet的调度,以及挂起和恢复tasklet执行的序列化,为高效,高度线程化的应用程序添加功能.Jython允许在Java平台上使用Python ,在.Net平台上使用IronPython.Cython是一种Python方言,它允许调用C函数并声明C类型,允许编译器从Cython代码生成有效的C代码.Shed Skin将隐式静态类型带入Python,并为独立程序或扩展模块生成C++.PyPy在Python的子集中实现Python,并更改一些实现细节,如添加垃圾收集而不是引用计数.目的是允许Python语言和实现开发由于更高级别的语言而变得更加高效.Py V8通过V8 JavaScript引擎桥接Python和JavaScript - 您可以说它正在解决平台问题.Psyco是一种特殊的JIT,可以为当前正在处理的数据动态生成特定版本的运行代码,这可以为您的Python代码提供加速,而无需编写优化的C模块.

其中,可以通过观察PEP-3146来了解Python的当前状态,其中概述了Unladen Swallow将如何合并到CPython中.这个PEP被接受了,因此Python开发人员判断目前最可行的方向是什么.请注意,它解决的是性能,而不是语言本身.

所以我真的要说Python的主要设计问题在性能领域 - 但这些基本上是任何动态语言必须面对的挑战,并且Python系列语言和实现正试图解决这些问题.至于直接设计错误,Javascript中列出的错误:好的部分,我认为"错误"的含义需要更明确地定义,但您可能想要查看以下的想法和意见:


S.L*_*ott 32

是否有博客文章或一些描述Python设计错误的书籍?

是.

它被称为Py3K向后不兼容的变化列表.

从这里开始:http://docs.python.org/release/3.0.1/whatsnew/3.0.html

阅读所有Python 3.x发行说明,了解有关Python 2中的错误的更多详细信息.

  • 对于一个没有理由打击Python的来源的+1,但是列出了许多可以相当明确地被认为是错误的东西. (4认同)
  • 有可能(尽管无论如何都是有争议的)一个人不同意这些决定.设计Python 3的人认为这些错误 - 他们是明智的Python程序员,但这并不能使他们选择不做任何错误. (4认同)
  • @Konrad Rudolph - 我希望我可以帮助你,并在C99标准化时及时回复你. (3认同)
  • 嗯,哦.我认为它是Python最大的强项之一,它打破了向后兼容性.我希望有更多的语言可以做到这一点.想象一下,我们仍然必须使用VHS"因为DVD会破坏向后兼容性." (2认同)
  • @ S.Lott请阅读Guido的邮件,他的理由是停止碰撞Python版本,而是稳定Python3(至少2 - 3年)并让它被采用.我在SO上看到的是人们仍然不习惯`bytes` vs` str`变化. (2认同)

Dan*_*man 21

我对Python的最大痛苦 - 以及在转向3.x时没有真正解决的问题 - 是标准库中缺乏适当的命名约定.

例如,为什么datetime模块包含一个本身叫做的类datetime?(更不用说为什么我们有独立datetimetime模块,但也是一个datetime.time类!)为什么是datetime.datetime小写,但是decimal.Decimal是大写?请告诉我为什么我们在xml命名空间下面有那么可怕的混乱:xml.sax但是xml.etree.ElementTree- 那里发生了什么?

  • 我明白你的观点,但这与语言设计没什么关系. (2认同)

Pav*_*ant 5

试试这些链接:

http://c2.com/cgi/wiki?PythonLanguage

http://c2.com/cgi/wiki?Python问题

  • 国际海事组织,“空白问题”是强项,而不是弱项。这也许是我最喜欢的语言功能,尽管我承认自己是前C ++程序员,但一开始我对此感到不安。自那以来,我节省了无数的时间,而不必写多余的} / fi / end / endif语句。 (3认同)

小智 5

经常让没有经验的开发人员感到惊讶的是候选人的错误.这是一个默认参数:

http://www.deadlybloodyserious.com/2008/05/default-argument-blunders/