使用 Black 与其他工具

与 Black 兼容的配置

Black 的所有更改都是无害的(或者至少应该是),但有一些会与其他工具冲突。与 Black 一起使用其他工具(如 linter 和类型检查器)并不少见。其中一些需要一些调整才能解决冲突。下面列出了各种格式的与 Black 兼容的配置,用于常见的工具。

请注意Black 仅支持 TOML 文件格式进行配置(例如 pyproject.toml)。提供的示例仅用于配置其相应的工具,使用 **它们** 支持的文件格式。

兼容的配置文件可以在 此处找到

isort

isort 帮助对 Python 代码中的导入进行排序和格式化。Black 也格式化导入,但方式不同于 isort 的默认设置,会导致冲突的更改。

配置文件

从 5.0.0 版开始,isort 支持 配置文件,以便轻松与常见代码风格互操作。您可以在 isort 支持的任何 配置文件 中设置 black 配置文件。下面是 pyproject.toml 的示例。

[tool.isort]
profile = "black"

自定义配置

如果您使用的是 5.0.0 之前的 isort 版本,或者您对 Black 有一些自定义配置,您可以调整您的 isort 配置以使其与 Black 兼容。下面是 .isort.cfg 的示例。

multi_line_output = 3
include_trailing_comma = True
force_grid_wrap = 0
use_parentheses = True
ensure_newline_before_comments = True
line_length = 88

为什么使用上面的选项?

Black 会将超过 line-length 的导入包装起来,方法是将标识符移到单独的行并添加一个尾随逗号。有关此行为的更详细说明,可以 在此处找到

isort 的默认导入包装模式(超过 line_length 限制)为“网格”。

from third_party import (lib1, lib2, lib3,
                         lib4, lib5, ...)

此样式与 Black 不兼容,但可以将 isort 配置为使用另一种包装模式,称为“垂直悬挂缩进”,如下所示。

from third_party import (
    lib1,
    lib2,
    lib3,
    lib4,
)

此样式与 Black 兼容,可以通过 multi-line-output = 3 实现。此外,如上所述,当包装长导入时,Black 会放置一个尾随逗号并使用括号。isort 应该遵循相同的行为,并通过 include_trailing_comma = Trueuse_parentheses = True 选项配置。

选项 force_grid_wrap = 0 只是告诉 isort 仅包装超过 line_length 限制的导入。

最后,isort 应该被告知在超过 Black 的默认 88 个字符限制时包装导入,方法是使用 line_length = 88 以及 ensure_newline_before_comments = True 来确保导入部分与注释之间的间距与 Black 相同。

请注意 ensure_newline_before_comments = True 仅在 isort >= 5 中起作用,但在旧版本中不会破坏,因此如果您运行的是旧版本,您可以保留它。

格式

.isort.cfg
[settings]
profile = black
setup.cfg
[isort]
profile = black
pyproject.toml
[tool.isort]
profile = 'black'
.editorconfig
[*.py]
profile = black

pycodestyle

pycodestyle 是一个代码 linter。它会警告您语法错误、可能的错误、风格错误等。在大多数情况下,pycodestyle 在警告风格错误时遵循 PEP 8。有一些偏差会导致与 Black 不兼容。

配置

max-line-length = 88
ignore = E203,E701

为什么使用上面的选项?

max-line-length

与 isort 一样,pycodestyle 应该被配置为允许最多 88 个字符的长度,这是 Black 的默认值。

E203

在某些情况下,根据 PEP 8,Black 将强制对切片运算符周围的空格进行等量处理。因此,pycodestyle 将引发 E203 whitespace before ':' 警告。由于此警告不符合 PEP 8,因此应将其禁用。

E701 / E704

Black 将仅包含 .. 的类和函数的实现折叠为单行。这与 PEP 8 中此类示例的格式方式一致。在所有其他情况下,Black 仍然会阻止同一行上的多个语句,这符合 PEP 8 通常不鼓励这样做。

但是,pycodestyle 并没有反映这种逻辑,在这种情况下可能会引发 E701 multiple statements on one line (colon) 警告。它默认禁用的 E704 multiple statements on one line (def) 规则也可能会引发警告,不应启用。

W503

当换行时,Black 会在二元运算符之前换行。这符合 PEP 8,从 2016 年 4 月 开始。Flake8 中有一个默认禁用的警告与这个 PEP 8 建议相冲突,称为 W503 line break before binary operator。它不应在您的配置中启用。您可以使用它的对应项 W504 line break after binary operator 来代替。

格式

setup.cfg, .pycodestyle, tox.ini
[pycodestyle]
max-line-length = 88
ignore = E203,E701

Flake8

Flake8 是多个 linter 的包装器,包括 pycodestyle。因此,它有许多相同的问题。

Bugbear

建议使用 Bugbear 插件 并启用 它的 B950 检查,而不是使用 Flake8 的 E501,因为它与 Black 的 10% 规则 一致。

安装 Bugbear 并使用以下配置。

[flake8]
max-line-length = 80
extend-select = B950
extend-ignore = E203,E501,E701

最小配置

在您无法或不想安装 Bugbear 的情况下,可以使用此最小兼容配置。

[flake8]
max-line-length = 88
extend-ignore = E203,E701

为什么使用上面的选项?

请参阅上面的 pycodestyle 部分

格式

.flake8, setup.cfg, tox.ini
[flake8]
max-line-length = 88
extend-ignore = E203,E701

Pylint

Pylint 也是一个代码 linter,类似于 Flake8。它有许多与 Flake8 相同的检查,甚至更多。它特别有更多关于样式约定(如变量命名)的格式检查。

配置

max-line-length = 88

为什么使用上面的选项?

Pylint 应该被配置为仅对超过 88 个字符的代码行提出警告,方法是使用 max-line-length = 88

如果您使用的是 pylint<2.6.0,也请禁用 C0326C0330,因为它们与 Black 格式不兼容,并且已被移除。

格式

pylintrc
[format]
max-line-length = 88
setup.cfg
[pylint]
max-line-length = 88
pyproject.toml
[tool.pylint.format]
max-line-length = "88"