Pythondevise错误

前段时间,当我学习Javascript的时候,我学习了Javascript:好的部分 ,我特别喜欢关于坏的和丑陋的部分。 当然,我不同意所有的事情,因为总结一个编程语言的devise缺陷在一定程度上是主观的 – 但是,例如,我想每个人都会同意关键字在javascript中是一个错误。 不过,我觉得阅读这样的评论很有用:即使不同意,也有很多东西需要学习。

有没有博客文章或一些描述Pythondevise错误的书? 例如,我想有些人会认为缺less尾部呼叫优化是一个错误; 可能还有其他值得学习的问题(或非问题)。

你要求一个链接或其他来源,但实际上没有一个。 信息分散在许多不同的地方。 真正构成devise错误的是什么,而且在语言定义中,只是将语法和语义问题列入计算,还是将平台和标准库问题以及具体的实施问题等实用性问题包括在内? 你可以说从性能的angular度来看,Python的dynamic性是一个devise错误,因为它使得很难做出一个简单高效的实现,并且使得代码完成,重构的IDE变得困难(我没有说完全不可能) ,和其他好东西。 同时,你可以争论dynamic语言的优点。

也许有一种方法开始考虑这个问题,就是看从Python 2.x到3.x的语言变化 。 有些人当然会认为print是一种function是不方便的,而有些人则认为这是一种改进。 总的来说,没有那么多的变化,其中大部分都是非常小而微妙的。 例如, map()filter()返回迭代器,而不是列表, range()行为就像xrange()一样, dict.keys()返回视图而不是列表。 然后有一些相关的整数变化,其中一个重大变化是二进制/string数据处理。 现在是文本数据 ,文本始终是Unicode。 有几种语法上的变化,但更多的是关于一致性而不是翻新整个语言。

从这个angular度来看,从语言(语法和语义)层面来看,Pythondevise得非常好,至less2.x. 你总是可以争论基于缩进的块语法,但我们都知道,不会导致任何地方… 😉

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

其中,通过查看PEP-3146可以说Python的当前状态,该PEP-3146概述了Unladen Swallow如何被合并到CPython中。 这个PEP被接受,因此是Python开发者对目前最可行的方向的判断。 注意它是为了performance,而不是语言本身。

所以真的我会说Python的主要devise问题是在性能领域 – 但是这些基本上和任何dynamic语言都必须面对的挑战一样,而Python语言和实现系列正在试图解决这些问题。 至于像Javascript中列出的那些devise错误 :好的部分 ,我认为“错误”的含义需要更明确的定义,但是你可能想要看看下面的想法和观点:

  • FLOSS每周11:Guido van Rossum (播客2006年8月4日)
  • Python博客的历史

有没有博客文章或一些描述Pythondevise错误的书?

是。

这就是所谓的Py3K列表反向不兼容的变化。

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

阅读所有Python 3.x发行说明,了解关于Python 2错误的更多细节。

我对Python最大的担忧 – 也就是在3.x中没有真正解决的问题 – 标准库中没有适当的命名约定。

例如,为什么datetime模块包含一个名为datetime的类? (不说为什么我们有单独的datetime timetime模块,但也是一个datetime.time类!)为什么是datetime.datetime小写,但decimal.Decimal是大写? 请告诉我为什么我们在xml命名空间下有这么糟糕的混乱: xml.sax ,但是xml.etree.ElementTree – 这是怎么回事?

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

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

我的个人语言是“lambda / local”函数的名字绑定:

 fns = [] for i in range(10): fns.append(lambda: i) for fn in fns: print(fn()) # !!! always 9 - not what I'd naively expect 

国际海事组织,我更喜欢在声明时查找lambda引用的名称。 我明白为什么它的工作原理,但仍然…

你现在必须通过绑定i到一个新的名字whos值不会改变,使用函数闭包解决它。

这是语言的一个小问题,而不是一个根本的错误,但是: 属性重写。 如果你重写一个属性(使用getters和setter),没有简单的方法获得父类的属性。

是的,这很奇怪,但我想这是你有可变variables。

我认为原因是“我”指的是一个具有可变值的框,“for”循环会随着时间的推移而改变该值,所以稍后读取框值就会得到剩下的唯一值。 我不知道如何解决这个缺乏可变variables的函数式编程语言(至less没有未经检查的可变variables)。

我使用的解决方法是创build一个默认值的新variables(默认值是在Python中的DEFINITION时间进行评估,这在其他时间是令人讨厌的),这会导致将值复制到新框中:

 fns = [] for i in range(10): fns.append(lambda j=i: j) for fn in fns: print(fn()) # works 

我感到奇怪的是,没有人提到全球解释locking 。

我在Python中最讨厌的一件事是在文件上使用writelines()和readlines()。 readlines()不仅返回一个行列表,而且在每一行的末尾还有\ n个字符,所以你必须总是这样做,去除它们:

 lines = [l.replace("\n", "").replace("\r", "") for l in f.readlines()] 

而当你想使用writelines()写行到文件,你必须在列表中的每一行的末尾添加\ n,然后再编写它们,就像这样:

 f.writelines([l + "\n" for l in lines]) 

writelines()和readlines()应该以独立于操作系统的方式照顾末尾的字符,所以你不必自己处理。

你应该能够去:

 lines = f.readlines() 

它应该返回行的列表,在行尾没有\ n或\ r字符。

同样,你应该能够去:

 f.writelines(lines) 

要将一行行写入文件,在写入文件时应该使用操作系统首选的enline字符,您不需要自己首先执行此操作。

你问好吗? 前段时间我已经写了关于这个话题的文件: http : //segfaulthunter.github.com/articles/biggestsurprise/

我最不喜欢的是range() ,因为它不符合你的期望,例如:

 >>> for i in range(1,10): print i, 1 2 3 4 5 6 7 8 9 

来自另一种语言的天真的用户也期望打印10。

我认为python中有很多奇怪的东西在处理builtins /常量。 如下所示:

 True = "hello" False = "hello" print True == False 

打印True

 def sorted(x): print "Haha, pwned" sorted([4, 3, 2, 1]) 

Lolwut? sorted是一个内置的全局函数。 实践中最糟糕的例子就是list ,人们倾向于把名字用作一个局部variables的方便名称,并最终导致全球内部人士的嘲笑。