编辑: 自从提出这个问题以来,标准 Python 科学库(这是目标领域)发生了很多改进。例如,numpy 项目在改进文档字符串方面付出了巨大的努力。人们仍然可以争论是否有可能从一开始就持续解决这些问题。


我有一个有点异端的问题:为什么这么多 Python 库的代码很混乱并且不遵循标准的最佳实践?或者你认为这个观察绝对不正确?与其他语言相比情况如何?我对你对此的看法很感兴趣。

我觉得质量欠缺的一些原因:

  • 文档字符串通常完全缺失或不完整,即使对于公共 API 也是如此。当一种方法被采用时,它是痛苦的 *args**kwargs 但没有记录可以给出哪些值。

  • 糟糕的 Python 编码实践,例如在外部添加新属性 __init__. 。诸如此类的事情使代码难以阅读(或维护)。

  • 几乎没有任何库遵循 PEP8 编码约定。有时,单个文件中的约定甚至不一致。

  • 整体设计比较混乱,没有明确的API。看来重构还不够。

  • 单元测试覆盖率低。

别误会我的意思, 我非常喜欢 Python 及其生态系统. 。尽管我在这些库中遇到了困难 他们通常都能完成工作,对此我很感激. 。但我也认为最终大量的开发人员时间都因为这些问题而被浪费了。也许那是因为 Python 给了你如此多的自由,以至于很容易写出糟糕的代码.

有帮助吗?

解决方案

关于文档,不仅仅是Python。恕我直言,如果有一个因素阻碍了 OSS 的广泛采用,那就是大多数 OSS 项目的文档水平确实很糟糕。这从代码级别开始并扩展到用户文档。我可以对任何从事 OSS 工作的人说:

a) 评论你的代码!不存在自记录代码这样的东西!

b) 将至少 25% 的项目时间预算用于最终用户文档。

我确实模糊地知道我在说什么 - 我自己有几个 OSS 项目,我为其他几个项目做出过贡献,而且我几乎只使用 OSS。昨天,我花了 4 个多小时尝试构建一个主要的 OSS 项目(没有名字,没有打包练习),但由于糟糕的、自相矛盾的文档而失败了。

其他提示

相反,作者每个人似乎都遵循自己的光荣惯例。有时约定甚至与库的同一文件不一致

欢迎来到现实世界的精彩代码!

FWIW 我遇到过的 Python 代码并不比任何其他语言更好或更差。

(嗯,显然比一般的 PHP 项目要好,但这并不公平。)

你需要意识到的第一件事是,Python 并不是在 2.x 版本左右从 Guido 的头脑中诞生、完全形成的。它在过去二十年里不断成长。

事实上,您提到的许多内容(例如,unittest 和 PEP-8)在某些标准库首次编写时甚至不存在。

您可能会注意到,您所查看的库越旧,它们就越有可能与当前的“最佳实践”产生分歧——通常是因为它们早于这些实践的广泛采用。较新的库更有可能符合当前的做法。

此外,有时往往有充分的理由 不是 让它们保持最新状态。想象一下,您有针对当前 Python 库编写的数万行代码。现在,其中一个库的维护者决定更改库以使类和函数名称符合 PEP-8。现在,每个拥有工作代码的人都必须重新访问大量代码,以免重命名破坏代码。

这并不是说 Python 库中没有可以改进的地方——确实有!但完美和完成任务之间总是需要权衡。这就是他们说“实用胜过纯粹”的原因之一。

这是因为 Python 不像 Java 或 .Net 那样得到企业界的支持。

如果我希望 Sun 推广我的 Java 库,我将遵循他们的指导方针。Python 的情况并非如此。我编写代码,人们发现它更好,并且它必须自行发展。

而且大多数 Python 开发人员来自 C++、C、Java、.Net 等。他们从第一天就开始编写生产代码。感谢 Python 的简单性。并且恶性循环还在继续。

甚至我花了一个月的时间才来到 PEP8 并重构我的代码。

PEP 8 随着时间的推移而发生变化。某些模块遵循旧的建议。您可以在 PIL 中看到这一点,它使用像“Image”这样的模块,其中模块包含单个主类,而不是推荐的小写模块名称,并且在 C 扩展中使用“c”前缀,而不是更现代的“ _“ 字首。

有些库是由深受其他领域(如 Java 和 C++)传统影响的人开发的。这些人更经常使用 CamelCase,而不是 PEP 8 推荐的 lowercase_with_underscores。

如果不参考的话,这里的答案就不完整 鲟鱼定律: :“百分之九十的一切都是垃圾。”

百分之九十的 [python 库] 都是粗暴的,但所有东西的百分之九十都是粗暴的

——鲟鱼法(释义)

听起来您似乎发现代码质量没有达到您的预期。也许来自学校、最佳实践书籍或高级开发人员。

在几家公司工作过之后,我发现自己经常被建议进行单元测试、记录代码、使用版本/源代码控制(我已经采纳了所有好的建议),然后发现该建议的提供者很少自己遵循这些建议。

我想说的是,您确实有这样的印象:有时代码质量很低,但这只是基于您的期望。当然,numpy 和其他包都是非常有用的包,即使没有按照您期望的标准进行编码。

标准就是意见,如果您认为标准很低,那么您可以尝试通过贡献来帮助提高这些标准,或者按原样接受它们,并确保编写代码作为您的后辈的榜样。有一天你会发现你自己负责。

至于 matplotlib,有一个项目可以改进它的“pythoness” - http://www.scipy.org/PyLab

科学库的特点是它们是由科学家编写的,而不是由专业软件开发人员编写的。而且,那些科学家都是用来写Fortran的。问题是——你想要工作代码还是漂亮的代码?

PEP8是一种风格 指导, ,不是样式要求。它甚至指出你应该“知道何时不一致”。就我个人而言,我不喜欢其中的一些指导方针。我更喜欢 camelCasesnake_case 因为我更习惯了。

而且我不会经常查看我正在使用的库的源代码,除非绝对必要(例如调试)。我更喜欢 文档 该库足够足够,我永远不必查看源代码。

说真的,为什么你真的关心源代码的用途 matplotlib 看起来,只要它能达到预期的目的就可以吗?

我同意你关于失踪的看法 docstrings (假设它们是公共元素而不是内部元素)但这并不是记录库的唯一方法。

我认为,Python 的问题在于,它被过于热切地推崇给非程序员(通过学校教育或贸易)作为“需要完成一些编程吗?”的解决方案。在这里,尝试一下这个简单而成熟的工具”。

与 PHP 如何取得如此巨大的成功以及如此多代码质量极差的库类似(即使 Python 的平均代码质量比 PHP 更好),普通 PHP 用户与普通 Python 用户类似,也没有太多编程经验经验或技能,并且很少有动力在这方面提高自己 - 他们着手实现某些目标,也许他们认为以图书馆的形式与社区分享是值得的,但最常见的是一旦工作完成他们没有兴趣改进代码或改进自己(我的意思是编程技能)。

解决方案可能是让 Python 库存储库(例如 PyPI)对接受贡献的包制定更严格的规则 - 通过审核流程处理此问题,其目的是确保质量 - 与主要 Linux 发行版在添加包之前有审核流程的方式相同到他们的存储库。

PEP8 只是一个约定,而不是一个要求。如果所有的Python程序员都这样,那就太可悲了 为了遵守一套共同的规则,我们会因为最轻微的问题而失去热情。

就缺少文档字符串而言 - 是的,它们在使用交互式帮助时可以提供帮助 - 但只要有,我通常不介意 一些 文档。我尽量不阅读我使用的库的源代码,我倾向于开始修改(重写)它们。

与其他语言相比,我认为语言设计在这里起着很大的作用。例如,在像 Java 这样的强类型语言中,即使库缺少良好的文档,您仍然可以从方法签名中推断出大部分功能。不 *args 去应对。

优秀软件文档示例的集合怎么样?
好的例子可能会比随机游走更快地带来整体改进。
该集合可以分为以下几类:
内联文档/帮助页面/教程/参考手册、网页/论文、图片/无。
每个条目应该有几个词 为什么 审稿人认为很好。
(在哪里:stackoverflow 的一角?)

尼科:我只能为自己回答,我的大部分 Python(以及 PHP 或 Ruby,所有动态“脚本”语言)工作都已完成 只为我 - 但如果其他人发现它有用,我总是在我的个人网站上发布它,但我从不经历任何文档或质量检查流程,因为只要它对我有用,我就很高兴。

嗯,他们 开源。因此,如果它们足够好,它们也会随着时间的推移而发展。

这是开源的众多优点之一。

如果您不知道项目是否会继续存在,那么编写大量文档和“好”代码通常没有什么意义。那只是浪费时间。

编辑:当然,第一次编写好的代码永远不会有什么坏处......但在很多情况下,也许仅仅“完成工作”就足够了。我认为,否则我们就不会享受 OSS 方面的大量选择。

我认为如果有足够多的人以特定的方式行事,可能会有一些解释。他们这样做并不是为了冒犯你。

代码质量*评论数量*时间=常数

选择两个 !

我使用 matplotlib 从来没有遇到过任何问题;不能说我看了很多代码——它是一个很好的库。做它应该做的事(免费!)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top