为什么你的 Python 代码应该是扁平且稀疏的

这是关于 Python 之禅的特别系列的一部分,重点关注第五和第六原则:扁平性和稀疏性。
124 位读者喜欢这个。
Digital creative of a browser on the internet

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 之禅不提供简单的解决方案。它提供的只是找到代码中可以改进的地方的方法,但并非总是提供“如何做”的指导。

散散步。洗个澡。闻闻花香。以莲花姿势坐着,认真思考,直到最终灵感迸发。当您最终开悟时,就该编写代码了。

接下来阅读什么
标签
Moshe sitting down, head slightly to the side. His t-shirt has Guardians of the Galaxy silhoutes against a background of sound visualization bars.
自 1998 年以来,Moshe 一直参与 Linux 社区,在 Linux “安装聚会”中提供帮助。自 1999 年以来,他一直在编写 Python 程序,并为核心 Python 解释器做出了贡献。Moshe 在这些术语存在之前就一直是 DevOps/SRE,他非常关心软件可靠性、构建可重复性以及其他此类事情。

评论已关闭。

知识共享许可协议本作品根据知识共享署名-相同方式共享 4.0 国际许可协议获得许可。
© . All rights reserved.