Python
Philosophy原文及相关说明: http://www.c2.com/cgi/wiki?PythonPhilosophy
译文发在:Python
Philosophy(Python
哲学)翻译及简析,2010-09-28
Python之禅 —— Tim Peters
- 美优于丑。
- 直白优于隐晦。
- 简单优于复杂。 [1]
- 复杂优于纠结。 [2]
- 扁平优于嵌套。 [3]
- 稀疏优于稠密。 [4]
- 可读性是有重要价值的。
- 特例可以有,但不能特例到打破规则。
- 尽管在纯粹性和实用性之间倾向的是实用性。
- 出错决不能无声无息地忽略。
- 除非明确地说明了是无声无息的。
- 面对二义性情况时,要拒绝任何猜的诱惑。
- 一件事应该一种做法 —— 并且宁愿只有一种做法 —— 一种显而易见的做法。
- 尽管在刚开始的时候这个做法可能不是那么显而易见,毕竟你不是荷兰人。 [5]
- 『现在』优于『决不』。 [6]
- 尽管『决不』常常优于『马上』。 [7]
- 如果一个实现难于解释清楚,那它是个差的想法。
- 如果一个实现很容易解释清楚,那它可能是个好的想法。
- 命名空间是个拍案叫绝的想法 — 放手多多用起来吧!
[1] [2] 单词 complex 的意思是 复杂,而 complicated 是 结构复杂。
在计算机领域中,complex 可以对应 单个模块的复杂,而 complicated 则可以对应 多个模块互相关联的复杂。
用计算机的术语来说,complicated 是不同模块之间紧『耦合』,体现了理解不深、设计不好。
软件的核心复杂度是不可避免的,但要这些集中一起,给用户一个干净高级的接口。
也就是说:如果 complex(核心复杂性)不可避免可以接受,但 complicated(偶然复杂性) 一定要想办法去除。
随着系统的理解深入,模块职责的划分以及之间的交互会更简单明了。
PS: 核心复杂性(essential
)与偶然复杂性(accidental
)的说明讨论可以参见《代码大全》与《领域驱动设计》。
翻译上,complex 翻成 复杂,complicated 翻成 纠结。
[3] 这里的『扁平』和『嵌套』说的是代码逻辑,嵌套的逻辑增加了逻辑及其对应理解的复杂性,应该想办法用更好的设计来避免深的逻辑嵌套实现。
另外,一个对应的话题是『数据』的 『扁平』 vs.『嵌套』,个人看来,期望用『嵌套』的数据,因为这可以简化数据理解规则和处理逻辑。可以把『嵌套』的数据看成是有『Namespace』的,也呼应了最后一条大力推荐使用命名空间。
更多讨论参见:
- Zen Masters: "Namespaces are a honking good thing" vs "Flat is better than nested". What gives? - reddit.com
- “Flat is better than nested” - for data as well as code? - stackoverflow.com
- The author makes the assertion that flat is better than nested, and indeed it's one of the rules in "import this", but I just don't see it. | Hacker News
[4] 稀疏、稠密指的是代码行中操作的疏密。
C
的Geek
,喜欢写稠密的代码,比如使用++
、--
运算符来压缩代码行。在Python
看来,这个做法不可取,即会让代码更可能出错(如自增操作的副作用),也降低了代码的可读性。
[5] 这里的荷兰人指Python
之父Guido,参见说明:武汉大学开源技术俱乐部 技术交流 第1期。
在这里作者TimPeters既含蓄地表达了对Python
之父Guido的敬意,又体现了自己作为Python
开发的傲娇,不是吗? 😁
[6] [7] 关于『Now/现在』、『never/决不』、『right now/马上』,个人理解,这个条目要说的是:
决定是否做实现一个功能,要想清楚,要么做要么不做,都能给出 明确的 理由;但不要模模糊糊的说『后面马上』做,回避对系统的分析思考。
否则结果会是:
- 『马上』做 是 『世界上最不能相信』的话 😄 ,想想饭店服务员的话『您要的菜马上就好』,其实你自己知道后面往往就不会去做这个功能了。 更多『世界上最不能相信』的话参见世界上最不能相信的几句话。
- 『马上』做 === 不经过思考的不做,结果系统没有做一个本该这个系统做的功能!然后这个功能在不合适的地方被实现,即系统设计有问题。
既有指明大是大非的理念,又有指导细节操作的准则。
既有谆谆教导的推荐,也有声色俱厉的禁止。
每一个点都千锤百炼;每一点都有直指内心的感觉。
看了 N 遍,每遍都会深思。
Python
说得内容对生活个人觉得一样有指导性,果然是哲学。
- Python(programming language) - Wikipedia
- No programming language offers what Python does philosophically.
在编程哲学上,Python
超越了其它编程语言。 - 武汉大学开源技术俱乐部 技术交流 第1期。
这里还有其它有关Python
有意思的东西。 - 核心复杂度的说明参见《代码大全》一书。
- 世界上最不能相信的几句话
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!