用 Black 随心所欲地格式化 Python

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

Alex Sanchez。CC BY-SA 4.0。

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

在本系列文章中,我们将介绍七个可以帮助您解决常见 Python 问题的 PyPI 库。在第一篇文章中,我们了解了 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 样式的编辑。 这些选项在持续集成 (CI) 系统中非常有用,该系统强制在本地运行 Black。 此外,如果 diff 输出被记录到 CI 输出中,在您需要修复输出但无法在本地安装 Black 的极少数情况下,您可以直接将其粘贴到 patch 中。

$ 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 这些术语出现之前就已经是一名 DevOps/SRE,他非常关心软件可靠性、构建可重复性以及其他此类事情。

3 条评论

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

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

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

我们什么都没学到吗?

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

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