我不喜欢Python

2020-05-07 19:50:13

这个标题有点谎话连篇。我认为Python是一种很好的、实用的语言,而且相对容易学和教。其庞大的库集合让您可以拼凑一个程序,几乎可以做任何您想做的事情。它没有APL或LISP的美感,当然也没有Julia的速度和表现力,但它是一个任何人都可以用来制作在一两天内解决现实世界中不平凡的问题的工具。如果您正在编写使用表单和数据库的网站,那么它就有Django web框架,这本身就可能是学习这门语言的一个足够好的理由。

对我来说,有时让Python头疼的是它是一种“面向对象”的语言。这些不是最初在Smalltalk中设想和实现的令人敬畏的消息传递对象。这些“对象”是基于类的,并且漂亮地配备了多重继承。作为单独的程序员,您永远不需要编写单个类。我当然不会。我把Python用作函数式语言。我从许多作用于列表、元组和字典的小的、可组合的函数创建了一个程序。这不是批评。Python是在20世纪80年代设计的,当时大多数人认为类是大势所趋。它们可能仍然是解决某些类型问题的最佳选择,但现在越来越多的人感到遗憾的是,需要忍受和维护由成堆的类构建的大型系统,这些类都保密并相互继承。

我心爱的姜戈就是一个很好的例子。如果我想自定义它的行为,我需要在神奇的框架代码迷宫中漫步,最终导致我自己的代码中充斥着对这个和那个、超级和元的不透明引用。我不再费心了,只需编写我自己的代码来替换我想要改变的Django部分,从而绕过框架中越来越大的部分。尽管如此,Django是一个如此成熟和坚实的工程,以至于我不愿放弃它。

正如我所说的,Python的强大之处在于能够利用它的库,包括多年来由这么多人添加的库。对于可能想要避免基于类的范例而编写函数代码的语言用户来说,这就是问题所在。这些库是由真正的Python程序员编写的,这意味着它们是面向对象的。它们通常与以函数样式编写的代码不能很好地配合,修改起来很麻烦,而且会做一些您可能没有预料到的事情。

这里有一个小例子,我希望它能向你展示我的一些意思。我需要编写一个读取、解析和写入bibtex文件的程序。这些是任何使用LaTeX文档准备系统的人都熟悉的出版物的纯文本数据库。该数据库存储有关某些出版物列表的书目信息;您只需在LaTeX文档中提到它的位置,您就可以获得所需样式的引文和参考章节排版。当然,有一个用于解析bibtex的Python库:它称为bibtexparser。我有没有提到过什么都有图书馆?这就是我们使用Python的原因。该库可以读取文件并将其解析为一个特殊的对象,即BibDatabase。该对象有一个名为Entries的属性;条目是一个字典列表,其中每个字典都包含一个出版物的书目信息,具有诸如作者、标题等关键字。有一个名为ID的特殊关键字唯一地标识每个出版物。它被作者选为引用中使用的助记符。坦率地说,这个库的文档不是很好,我不得不进行实验,看看它是如何工作的。我发现我可以修改条目,或者从列表中删除或添加到列表中,并且在将新的bibtex文件写回磁盘时会反映我所做的更改。到现在为止还好。

BibDatabase对象有另一种表示数据的方式。它还有一个ENTRIES_DICT属性,这是一个字典字典。每个出版物都显示为一个字典,其关键字是出版物的ID。换句话说,它与条目列表几乎相同,但数据的排列略有不同。它不是字典列表,而是一个值是字典、键是ID的字典。这是有意义的,也是表示该数据的最自然的方式。

在我的程序中的某个时候,使用数据的Entries_dict版本而不是数据的Entries视图变得很方便。我发现我可以更改任何字典的内容,当我将BibDatabase转换为磁盘上的文件时,更改再次被忠实地保留下来。但是随后我尝试通过向Entries_dict字典添加一个条目来添加一个新出版物。新发布未出现在输出文件中。

文档没有任何帮助。我开始阅读源代码,毫不奇怪,它是基于类的。不是转换数据结构的透明函数,而是不透明的c

这是一个典型的Python库,这就是使用Python会如此烦人的原因。如果您想以与其创建者的预期稍有不同的方式使用库,您可能会被令人惊讶的行为绊倒,并且将不得不费力地通过错综复杂的基于类的源代码(有时这个库恰好非常简单)来找出所有的秘密方法都在做什么。这可能是一个品味问题,但我发现在Clojure或Julia中使用和理解库是一种令人耳目一新的对比。

评论通过电子邮件处理。如果您希望我将其包括在这里,请发送邮件至[email protected]。我永远不会暴露你的电子邮件地址。如果你想让我把你的名字也藏起来,请告诉我。

Lee-Phillips.org是亚马逊服务有限责任公司联合计划(Amazon Services LLC Associates Program)的参与者,该计划是一项联合广告计划,旨在为网站提供一种通过广告和链接到Amazon.com赚取广告费的手段。