96

我想通过blackpython 格式化程序忽略特定的多行代码。特别是,这用于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]])

我在 github 中发现了这个问题black,但这仅适用于内联命令,这不是我在这里所拥有的。

对于多行代码,我能做些什么来实现这一点?

4

3 回答 3

158

您可以#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

于 2019-10-28T00:29:19.337 回答
29

如果您愿意稍微更改您的代码,那么 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 缺乏内联注释!

于 2020-07-13T22:19:24.330 回答
3

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

(注意最后一个逗号)

于 2022-01-28T16:43:31.457 回答