Python 之禅之所以如此称呼是有原因的。它从未打算为编程提供易于遵循的指南。这些规则简洁明了,旨在引导读者深入思考。
为了正确欣赏 Python 之禅,您必须阅读它,然后冥想其含义。如果 Zen 旨在成为一套明确的规则,那么它具有相互矛盾的规则将是一个缺陷。然而,作为帮助您冥想最佳解决方案的工具,矛盾是强大的。
扁平优于嵌套。
在 Python 对缩进的强烈坚持中,没有比“扁平”更明显的压力了。其他语言通常会引入一种“欺骗”嵌套结构的实现,从而减少缩进要求。为了理解这一点,让我们看一下 JavaScript。
JavaScript 本身是异步的,这意味着程序员使用 JavaScript 编写代码时会使用大量回调。
a(function(resultsFromA) {
b(resultsFromA, function(resultsfromB) {
c(resultsFromC, function(resultsFromC) {
console.log(resultsFromC)
}
}
}
忽略代码,观察模式以及缩进导致最右点的方式。这种独特的“箭头”形状对于快速浏览代码的眼睛来说很吃力,因此它被认为是不受欢迎的,甚至被戏称为“回调地狱”。但是,在 JavaScript 中,可以“欺骗”并且不让缩进反映嵌套。
a(function(resultsFromA) {
b(resultsFromA,
function(resultsfromB) {
c(resultsFromC,
function(resultsFromC) {
console.log(resultsFromC)
}}}
Python 不允许任何此类作弊选项:程序中的每个嵌套级别都必须反映在缩进级别中。因此,Python 中的深层嵌套看起来是深层嵌套的。这使得“回调地狱”在 Python 中比在 JavaScript 中更糟糕:嵌套回调意味着缩进,而没有使用大括号“欺骗”的选项。
这种挑战,结合 Zen 原则,导致了我参与开发的库的优雅解决方案。在 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 的 deferreds 的影响。)
稀疏优于密集。
使某物变得不那么密集的最简单方法是引入嵌套。这种习惯就是为什么稀疏性原则遵循前一个原则的原因:在我们尽可能减少嵌套之后,我们通常会剩下密集的代码或数据结构。从这个意义上讲,密度是将太多信息塞进少量代码中,使得在出现问题时难以辨别。
降低密度需要创造性思维,并且没有简单的解决方案。Python 之禅不提供简单的解决方案。它提供的只是找到代码中可以改进的地方的方法,但并非总是提供“如何做”的指导。
散散步。洗个澡。闻闻花香。以莲花姿势坐着,认真思考,直到最终灵感迸发。当您最终开悟时,就该编写代码了。
评论已关闭。