这是一个特殊的Python禅宗系列中的第三篇,这一篇着眼于原则五和六:扁平和稀疏。《Python之禅》之所以得名,正是因为它简洁的规则旨在让读者深入思考,而不仅仅是提供一个易于遵循的编程指南。看完之后如果不三思而后行,绝对难以体会Python之禅的妙处。如果Python之禅只是列出了一套明确的规则,那么规律之间的矛盾是缺点,但作为引导读者思考最佳解决方案的工具,矛盾是极好的。FlatisbetterthannestedFlat优于nested迫于对缩进的强烈要求,Python对“扁平化”的需求显然远超其他人。为了减轻缩进的需要,其他编程语言通常会在嵌套结构中加入一种“作弊”的手段。为了理解这一点,让我们一起来看看JavaScript。JavaScript本质上是异步的,这意味着程序员用JavaScript编写的代码会用到很多回调函数。a(function(resultsFromA){b(resultsFromA,function(resultsfromB){c(resultsFromC,function(resultsFromC){console.log(resultsFromC)}}}忽略这段代码的具体内容,只观察这段代码的形状和indentationbringsawaytothemostrightpoint.这种独特的“箭头”图形在我们扫码的时候格外醒目,所以这种写法被认为是不可取的,甚至得到了“回调地狱”的绰号。但是,在JavaScript中,这种反映嵌套关系的缩进可以通过“作弊”来避免。}}Python不提供这种作弊方式:代码中的每一层嵌套忠实对应一层缩进,因此Python的深层嵌套关系在视觉上也必须是深嵌套。这使得“回调地狱”在Python中成为比在JavaScript中严重得多的问题:嵌套的回调函数必须缩进,而且绝对没有用花括号“作弊”的可能。这一挑战与Python之禅的指导原则相结合,在我贡献的库中产生了一个优雅的解决方案。我们在Twisted框架中提出了deferred抽象,后来在JavaScript中流行的promise抽象也是受其启发。正是由于Python对干净代码的坚持,它可以推动Python开发人员去发现新的和强大的抽象。future_value=future_result()future_value.addCallback(a)future_value.addCallback(b)future_value.addCallback(c)(现代JavaScript程序员可能会觉得这段代码很眼熟:promises确实深受Twisted中延迟抽象的影响。)Sparseisbetterthandense稀疏优于密集降低代码密度的最简单方法是引入嵌套。这种习惯就是为什么稀疏性原则遵循前一个原则:在尽我们所能减少嵌套之后,我们往往会留下密集的代码或数据结构。所谓密集,是指包含过多信息的小段代码,这会使发生错误后的解析变得困难。这种密度只能通过创造性思维来提高,没有捷径可走。Python之禅并没有为我们提供简单的解决方案,它只是指出了改进代码的方法,而不是提供了“如何”去做。起床散步,洗个热水澡,或者闻闻花香。盘腿而坐,冥想直到灵感来袭。当您终于获得灵感时,就该开始编码了。
