黑色格式化程序 - 忽略特定的多行代码

215

我想让python代码格式化工具black忽略特定的多行代码。具体来说,这是用于构建np.array或矩阵时,因格式化而变得难看的情况。以下是示例。

np.array(
    [
        [1, 0, 0, 0],
        [0, -1, 0, 0],
        [0, 0, 1, 0],
        [0, 0, 0, -1],
    ]
)
# Will be formatted to
np.array([[1, 0, 0, 0], [0, -1, 0, 0], [0, 0, 1, 0], [0, 0, 0, -1]])

我在 black 的 Github 上找到了这个问题,但那只适用于行内命令,而我需要的不是这样的。

有什么办法可以实现多行代码的格式化吗?


4
这个问题是否表示您可以在它之前添加 # fmt: off,并在它之后添加 # fmt: on - Eric
3个回答

389

您可以使用#fmt: on/offdocs)如链接中所述。在这里,它看起来像:

# fmt: off
np.array(
    [
        [1, 0, 0, 0],
        [0, -1, 0, 0],
        [0, 0, 1, 0],
        [0, 0, 0, -1],
    ]
)
# fmt: on

# fmt: off 禁用格式化,直到使用 # fmt: on 重新激活。


2
啊,谢谢!这个按预期工作了!我之前试过将它作为头部,但没有再次打开它,所以它没起作用。 - Darren Christopher
4
可以通过在 pyproject.toml 文件中配置排除规则来实现吗?我希望为我的项目设置此选项,而不是在每个文件中添加 #fmt:on/off。请注意,翻译内容不能改变原意并尽可能使其更易于理解。 - Abhishek Upadhyaya
1
我对 pyproject.toml 不是很了解,也许你可以开一个新的问题? - OriolAbril
32
在查阅文档后,我发现您也可以使用#fmt:skip来跳过个别行。 - GammaGames
请注意,如果您尝试最小化禁用格式的行并将 # fmt: off 放在语句内部,black 将会报错。 - Troy Daniels
显示剩余2条评论

44

如果你愿意稍微改动一下你的代码,那么 Black 将不会对以下内容进行任何更改:

contents = [
    [1, 0, 0, 0],
    [0, -1, 0, 0],
    [0, 0, 1, 0],
    [0, 0, 0, -1],
]

np.array(contents)

这是因为多行列表中的尾逗号是有特殊意义的。Black认为这意味着你打算在未来扩展列表, 尽管在这种情况下它只是意味着Black的风格不太易读。不幸的是,当列表被包裹在额外的函数调用中时,尾逗号并不足够神奇。

np.array(
    [
        # just say anything
        [1, 0, 0, 0],
        [0, -1, 0, 0],
        [0, 0, 1, 0],
        [0, 0, 0, -1],
    ]
)

这是因为Black无法战胜Python缺乏行内注释的问题!

18

最新版本的black(>=21.0)考虑了最后一个元素后面的逗号。

因此:

np.array(
    [
        [1, 0, 0, 0],
        [0, -1, 0, 0],
        [0, 0, 1, 0],
        [0, 0, 0, -1]
    ]
)

将被格式化为:

np.array([[1, 0, 0, 0], [0, -1, 0, 0], [0, 0, 1, 0], [0, 0, 0, -1]])

(注意没有最后一个逗号)

而是

np.array([[1, 0, 0, 0], [0, -1, 0, 0], [0, 0, 1, 0], [0, 0, 0, -1],])

将被格式化为:

np.array(
    [
        [1, 0, 0, 0],
        [0, -1, 0, 0],
        [0, 0, 1, 0],
        [0, 0, 0, -1],
    ]
)

(注意最后的逗号)

在我的电脑上,无论数组的大小如何,也无论是否有最后一个逗号,黑色都会保持单行或多行样式。我正在使用黑色22.1.0版本。 - Codoscope
@Codoscope,这可能是IDE设置的问题。Python解释器是否在IDE中“可见”,其中已安装黑色(black)? - SeF
我直接在终端上使用黑色,Python 3.8.11 可见。也许这不是问题,他们可能决定保持单/多行的格式以保留开发者的选择。 - Codoscope

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接