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

Dar*_*her 62 python code-formatting python-black

我想通过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]])
Run Code Online (Sandbox Code Playgroud)

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

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

Ori*_*ril 106

您可以#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
Run Code Online (Sandbox Code Playgroud)

# fmt: off 禁用所有后续行的格式,直到再次激活格式 # fmt: on

  • 经过一番深入研究文档后,我还发现您还可以使用“# fmt:skip”来跳过单独的行。 (37认同)
  • 可以通过在“pyproject.toml”文件中配置排除来完成此操作吗?我不想在每个文件中添加“#fmt: on/off”,而是想为我的项目设置它。 (4认同)
  • 啊,谢谢!这按预期工作!我尝试将其作为标题,但没有再次打开它,这就是它不起作用的原因。 (2认同)

SeF*_*SeF 20

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

所以:

np.array(
    [
        [1, 0, 0, 0],
        [0, -1, 0, 0],
        [0, 0, 1, 0],
        [0, 0, 0, -1]
    ]
)
Run Code Online (Sandbox Code Playgroud)

将被格式化为:

np.array([[1, 0, 0, 0], [0, -1, 0, 0], [0, 0, 1, 0], [0, 0, 0, -1]])
Run Code Online (Sandbox Code Playgroud)

(注意最后没有逗号)

反而

np.array([[1, 0, 0, 0], [0, -1, 0, 0], [0, 0, 1, 0], [0, 0, 0, -1],])
Run Code Online (Sandbox Code Playgroud)

将被格式化为:

np.array(
    [
        [1, 0, 0, 0],
        [0, -1, 0, 0],
        [0, 0, 1, 0],
        [0, 0, 0, -1],
    ]
)
Run Code Online (Sandbox Code Playgroud)

(注意最后一个逗号)


Ste*_*sop 18

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

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

np.array(contents)
Run Code Online (Sandbox Code Playgroud)

这是因为多行列表中的尾随逗号很神奇。Black 认为它意味着你计划在未来扩展列表,尽管在这种情况下它只是意味着 Black 的风格不是很可读。不幸的是,后面的逗号不是魔术足够的工作时,列表被包裹在额外的函数调用。

np.array(
    [
        # just say anything
        [1, 0, 0, 0],
        [0, -1, 0, 0],
        [0, 0, 1, 0],
        [0, 0, 0, -1],
    ]
)
Run Code Online (Sandbox Code Playgroud)

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