使用 Black 随心所欲地格式化 Python

在我们的系列文章中了解更多关于解决常见 Python 问题的信息,该系列涵盖七个 PyPI 库。
296 位读者喜欢这个。
OpenStack source code (Python) in VIM

Alex Sanchez。CC BY-SA 4.0。

Python 是当今使用最流行的编程语言之一,这有充分的理由:它是开源的,它有广泛的用途(例如 Web 编程、商业应用程序、游戏、科学编程等等),并且它有一个充满活力和专注的社区支持它。这个社区是我们拥有如此庞大、多样化的软件包范围的原因,这些软件包在Python 包索引 (PyPI) 中可用,以扩展和改进 Python 并解决不可避免出现的小故障。

在本系列文章中,我们将研究七个 PyPI 库,它们可以帮助您解决常见的 Python 问题。在第一篇文章中,我们了解了 Cython;今天,我们将研究 Black 代码格式化工具。

Black

有时,创造力可能是一件美好的事情。有时,它只是一种痛苦。我喜欢创造性地解决难题,但我希望我的 Python 代码格式尽可能一致。没有人会对使用“有趣”缩进的代码印象深刻。

但比不一致的格式更糟糕的是代码审查,其中只包含格式细节。这让审查人员感到恼火,也让代码被审查的人感到更加恼火。当你的 linter 告诉你你的代码缩进不正确,但没有提示正确的缩进量时,这也很令人恼火。

Black 登场。Black 不是告诉你该怎么做,而是一个优秀的、勤奋的机器人:它会为你修复你的代码。

要了解它是如何工作的,请随意编写一些非常不一致的东西,例如

def add(a, b): return a+b

def mult(a, b):
      return \
        a              *        b

Black 会抱怨吗?当然不会,它只是为你修复它!

$ black math 
reformatted math
All done! ✨ ? ✨
1 file reformatted.
$ cat math 
def add(a, b):
    return a + b


def mult(a, b):
    return a * b

Black 确实提供了选择失败而不是修复,甚至输出 diff 风格的编辑。这些选项在强制在本地运行 Black 的持续集成 (CI) 系统中非常有用。此外,如果 diff 输出被记录到 CI 输出中,您可以直接将其粘贴到 patch 中,以防您需要修复输出但无法在本地安装 Black 的罕见情况。

$ black --check --diff bad 
--- math 2019-04-09 17:24:22.747815 +0000
+++ math 2019-04-09 17:26:04.269451 +0000
@@ -1,7 +1,7 @@
-def add(a, b): return a + b
+def add(a, b):
+    return a + b
 
 
 def mult(a, b):
-          return \
-                  a             *             b
+    return a * b
 
would reformat math
All done! ? ? ?
1 file would be reformatted.
$ echo $?
1

在本系列的下一篇文章中,我们将研究 attrs,一个库,它可以帮助您快速编写简洁、正确的代码。

接下来阅读什么
标签
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,他非常关心软件可靠性、构建可重复性以及其他此类事情。

3 条评论

有没有办法配置 black 使用的样式?

例如,它用于每个缩进级别的空格数?而且我真的非常不喜欢 defs 和函数调用在左括号前没有空格。

大约 40 年前,当我在 Multics 系统上编写 PL/1 时,有一个名为 format_pl1 的程序,它在源代码的开头使用特定的注释来定制格式。

我们什么都没学到吗?

我阅读了文档,它有 # fmt: off 和 # fmt: on 来排除那些你只需要保留格式的情况,所以我可以忍受它。

Creative Commons License本作品根据 Creative Commons Attribution-Share Alike 4.0 International License 获得许可。
© . All rights reserved.