使用 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 = True
和 use_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
,也请禁用 C0326
和 C0330
,因为它们与 Black 格式不兼容,并且已被移除。
格式¶
pylintrc
[format]
max-line-length = 88
setup.cfg
[pylint]
max-line-length = 88
pyproject.toml
[tool.pylint.format]
max-line-length = "88"