Python 黑色风格差异

Python black style discrepancy

我正在使用 black 来格式化我的 python 代码。我观察到以下行为。我承认这是一个非常具体的案例,但它让我很紧张。

假设我有以下代码:

@pytest.mark.parametrize(
"first",
["second"],
)

black 不会改变这一点。但是,如果我删除 ["second"]:

之后的尾随逗号
@pytest.mark.parametrize(
"first",
["second"]
)

black 进行了很好的重新排序:

@pytest.mark.parametrize("first", ["second"])

另一方面,让我们看看以下内容:

@pytest.mark.parametrize(
"This is a very long line. Black will not be able to to a linebreak here.",
["second"],
)

在这种情况下,black 也不会改变任何东西。到目前为止,一切都很好。现在,我再次删除 ["second"] 之后的尾随逗号:

@pytest.mark.parametrize(
"This is a very long line and black will not be able to do a line break here.",
["second"]
)

由于行太长,black 没有像以前那样很好地重新排列成一行。但是,black["second"]:

之后添加了一个尾随逗号
@pytest.mark.parametrize(
"This is a very long line and black will not be able to do a line break here.",
["second"],
)

我不喜欢这样。当我在代码中遇到这样的列表时,我总是倾向于删除尾随的逗号以强制对一行进行重新排序。但是,在大多数情况下,black 会再次添加它...

根据我的理解,黑色行为是预料之中的,因为目的之一是限制 git 差异内的更改数量。

如果行太长,你已经处于多行书写状态。如果你是多行写作,那么它应该以逗号结尾。

这样,如果您在元组、列表等中添加元素,或者在方法或函数中添加参数,它不会为您添加逗号的行生成差异。

如果相反你在mono-line写的不是太长,黑色会考虑你是否加了尾随的逗号。如果尾随逗号,它将转到 multi-line,否则将鼓励 mono-line.

a = [1, 2,]
# goes to
a = [
    1,
    2,
]

# and

a = [1, 2]
# remains:
a = [1, 2]