编辑:由于这个问题被要求在标准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项目更好,但这不太公平.)
你需要意识到的第一件事是,在版本2.x的某个时候,Python并没有完全形成.它在过去二十年中不断发展壮大.
事实上,你提到的一些事情(例如,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.
如果不参考斯特金定律,这里的答案就不完整:"百分之九十都是废话."
PEP8是一种风格指南,而不是风格要求.它甚至声明你应该"知道何时不一致".就个人而言,我不喜欢其中的一些指导方针.我更喜欢camelCase
,snake_case
因为我已经习惯了.
我不经常查看我正在使用的库的源代码,除非它是绝对必要的(例如调试).我更喜欢这个库的文档足够充分,我从来不必查看源代码.
说真的,为什么你真正关心源代码matplotlib
看起来像什么,只要它做它想要做的事情?
我同意你的遗漏docstrings
(假设它们是公共元素而不是内部元素),但这不是记录库的唯一方法.
对于matplotlib,有一个项目来改进它的"pythoness" - http://www.scipy.org/PyLab
关于科学图书馆的事情是,它们是由科学家编写的,而不是由专业软件开发人员编写的.转移,那些科学家习惯写Fortran.问题是 - 你宁愿拥有工作代码还是漂亮的代码?
百分之九十的[python库]是粗糙的,但百分之九十的都是粗糙的
- 鲟鱼法(释义)
听起来您已经发现代码质量不符合您期望的预期.也许来自学校,或最佳实践书籍或高级开发人员.
在几家公司工作之后,我发现自己经常被建议做单元测试,文档代码,使用版本/源代码控制(我已经采取的所有好建议),然后发现该建议的提供者很少自己遵循建议.
我会说你确实有正确的印象,有时代码质量很低,但只能根据你的期望.当然numpy和其他是非常有用的包,即使没有编码到你设定的标准.
标准是意见,如果你认为标准很低,那么你可以尝试通过贡献或者接受它们来帮助制定这些标准,并确保编写代码作为一个例子给你会发现自己掌管一天.