原文#
The Zen of Python, by Tim Peters
Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let's do more of those!
翻译#
Python之禅,作者:Tim Peters
优美 > 丑陋。
明确 > 隐晦。
简单 > 复杂。
复杂 > 繁复。
扁平 > 嵌套。
稀疏 > 密集。
可读性至关重要。
特殊情况并不特殊到足以打破规则。
尽管实用性胜过纯粹性。
错误不应该悄悄地通过。
除非明确地被消除。
面对模棱两可,拒绝猜测的诱惑。
应该有一种明显的方法来做它,最好只有一种。
尽管这种方法一开始可能不明显,除非你是荷兰人。
现在比永远好。
尽管永远往往比*现在*好。
如果实现难以解释,那是个坏主意。
如果实现容易解释,那可能是个好主意。
命名空间是一个非常棒的想法 - 让我们做更多这样的事情!
考据#
该引入的包显式地一条条罗列出来,不要合并;不要用星号;不要在方法里藏意想不到的的副作用,等等等等。还一个例子,有一种著名的软件设计原则 Convention over Configuration(约定优于配置)如果做得不谨慎,比如你约定的规则并不是真的业界惯例,就会违背这条。
StackOverflow 上针对这句话的提问:必要的复杂总是难免的,繁复啰嗦的代码却是不可接受的。你可以做很多事,很复杂的事,但是不能啰嗦,更不能难以理解。复杂不是罪,但是代码需要更有逻辑、更有机的组织。简而言之,Simple > Complex > Complicated > Chaotic。(另外,以上内容仅限 Python 语境,不同语境下对 Complex 和 Complicated 的定义可能会有所不同)
有人喜欢写很长的 one-liner 比如:lambda L: [] if L==[] else qsort([x for x in L[1:] if x< L[0]]) + L[0:1] + qsort([x for x in L[1:] if x>=L[0]]) # 一行流快速排序
这样固然可以炫技,但是也很难懂啊。让其他人读不懂的代码不是优雅的代码
写这篇文章的动机之一就是看到有人把 Readability counts 翻译成可读性计数
实操中很多人不注意 catch 完就 log 一下就不管了,很快啊,这样好么?这样不好。软件界一般都讲 Let it fail,学名为 Fail-fast 法则。简而言之就是整个项目周期中越早暴露的问题,其修复成本越低。等到你的项目上线了结果出来各种诡异的 bug 你会毫无头绪,结果只能去翻长长的日志。所以我劝各位,不要再犯这样的聪明,小聪明。
本文作者 Tim Peters 解释说这里的荷兰人指的是 Python 的作者 Guido van Rossum 吹捧 gvanrossum 的彩虹屁:等同于 “你个荷兰佬他娘的还真是个天才”
贯穿整个 PEP 20 的核心就是一句话 “你的代码是给别人读的!”。从这个角度而言,难以理解、难以维护的代码,即便是 “高性能”,也肯定不是好代码;但是反过来,一目了然的逻辑也不代表就一定是好代码。编程可太难了