在映射推导式中禁用 dict 表达式的黑色格式

Nit*_*kin 9 python formatting python-black

我目前正在研究Black作为我们的默认格式化程序,但是,我有一些边缘情况不能很好地格式化,我想知道是否有办法获得我想要的结果。

Black的文档部分探讨了我的问题,我有一个水平分布的字典表达式,我想保持这种状态,因为我希望添加行,例如:

# Black would keep this as-is because of the trailing comma
TRANSLATIONS = {
    "en_us": "English (US)",
    "pl_pl": "polski",
}
Run Code Online (Sandbox Code Playgroud)

但在我的情况下,字典在列表理解中:

res = [
    {
        'id': item.id,
        'name': item.name,
    }
    for item in items.select()
]
Run Code Online (Sandbox Code Playgroud)

无论尾随逗号如何,哪个 Black 都会崩溃,如下所示:

res = [
    {"id": item.id, "name": item.name,}
    for item in items.select()
]
Run Code Online (Sandbox Code Playgroud)

在这些情况下,有没有办法告诉黑方保留水平结构?

Nit*_*kin 9

看来黑色解决了这个问题。

在撰写此答案时,使用黑色版本20.8b1,格式已按照我的希望完成。

只要字典表达式中的最后一项有一个神奇的尾随逗号,black 就会格式化列表理解中的代码。

res = [
    {
        "id": item.id, "name": item.name,
    }
    for item in items.select()
]
Run Code Online (Sandbox Code Playgroud)

将格式化为:

res = [
    {
        "id": item.id,
        "name": item.name,
    }
    for item in items.select()
]
Run Code Online (Sandbox Code Playgroud)


mil*_*azs 5

您可以使用# fmt: off/# fmt: on功能。

正如你在下面看到的:

  • 之前的列表推导式# fmt: off已经被 Black 格式化
  • # fmt: off/# fmt: on列表理解之间没有被 Black 格式化
  • # fmt: onBlack 格式化后的列表理解

代码(由 Black 格式化后):

res1 = [{"id": item[0], "name": item[1],} for item in [[5, "foo"], [6, "bar"]]]

# fmt: off
res2 = [
    {
        'id': item[0],
        'name': item[1],
    }
    for item in [[7, "fooo"], [8, "barr"]]
]
# fmt: on

res3 = [{"id": item[0], "name": item[1],} for item in [[9, "fooo0"], [10, "barrr"]]]

print(res1)
print(res2)
print(res3)
Run Code Online (Sandbox Code Playgroud)

Python 黑色的输出:

/home/milanbalazs/.local/bin/black --fast -l 100 -v /home/milanbalazs/test.py
reformatted /home/milanbalazs/test.py
All done! ?  ?
1 file reformatted.
Run Code Online (Sandbox Code Playgroud)

代码输出:

>>> python3 test.py 
[{'id': 5, 'name': 'foo'}, {'id': 6, 'name': 'bar'}]
[{'id': 7, 'name': 'fooo'}, {'id': 8, 'name': 'barr'}]
[{'id': 9, 'name': 'fooo0'}, {'id': 10, 'name': 'barrr'}]
Run Code Online (Sandbox Code Playgroud)

Black 文档的相关部分:https : //github.com/psf/black#the-black-code-style

  • 我知道可以通过这种方式禁用代码段的格式,但我更感兴趣的是是否可以在不禁用这些部分的格式的情况下使黑色发挥良好。 (3认同)