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

Black formatter - Ignore specific multi-line code

我想通过 black python 格式化程序忽略特定的多行代码。特别是,这用于 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 中发现了 this 问题,但这只适用于内联命令,我这里没有。

我可以做些什么来实现多行代码吗?

您可以按照问题链接中的说明使用 #fmt: on/off。在您的情况下,它看起来像:

# 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

再次激活格式

如果您愿意稍微更改您的代码,那么 Black 将保留以下任一项:

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

np.array(contents)

这是因为多行列表中的尾随逗号很神奇。 Black takes it to mean that you plan to extend the list in future,虽然在这种情况下它只是意味着黑色的风格不是很可读。不幸的是,当列表包含在那个额外的函数调用中时,尾随逗号并不神奇足以工作。

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

这是因为 Black 无法战胜 Python 缺少内联注释!

最新版本的黑色(>=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],
    ]
)

(注意最后一个逗号)