python-3.x 使用黑色格式化程序嵌套长列表和集合

toiithl6  于 2023-04-08  发布在  Python
关注(0)|答案(5)|浏览(128)

python black formatter可以嵌套长列表和集合吗?例如:
输入

coworkers = {"amy", "bill", "raj", "satoshi", "jim", "lifeng", "jeff", "sandeep", "mike"}

默认输出

coworkers = {
    "amy",
    "bill",
    "raj",
    "satoshi",
    "jim",
    "lifeng",
    "jeff",
    "sandeep",
    "mike",
}

期望输出

coworkers = {
    "amy", "bill", "raj", "satoshi", "jim",
    "lifeng", "jeff", "sandeep", "mike",
}
ftf50wuq

ftf50wuq1#

您可以暂时停用黑色

# demo.py

# deactivate black temporarily
# fmt: off
coworkers = {"amy", "bill", "raj", "satoshi", "jim", "lifeng", "jeff", "sandeep", "mike"}
# fmt: on
coworkers = {"amy", "bill", "raj", "satoshi", "jim", "lifeng", "jeff", "sandeep", "mike"}

得到与

$ black demo.py

改革为

# demo.py

# deactivate black temporarily
# fmt: off
coworkers = {"amy", "bill", "raj", "satoshi", "jim", "lifeng", "jeff", "sandeep", "mike"}
# fmt: on
coworkers = {
    "amy",
    "bill",
    "raj",
    "satoshi",
    "jim",
    "lifeng",
    "jeff",
    "sandeep",
    "mike",
}
um6iljoc

um6iljoc2#

这是不可能的,因为Black使用的编码风格可以被视为PEP 8的严格子集。请阅读docs here。具体来说:
对于垂直空格,Black尝试每行呈现一个完整的表达式或简单的语句。如果这符合分配的行长度,那就太好了。

# in:
j = [1,
     2,
     3
]

# out:
j = [1, 2, 3]

如果没有,Black将查看第一个外部匹配方括号的内容,并将其放在单独的缩进行中。

# This piece of code is written by me, it isn't part of the original doc
# in
j = [1, 2, 3, 4, 5, 6, 7]

# out
j = [
    1, 2, 3, 4, 5, 6, 7
]

如果这仍然不符合要求,它将使用相同的规则进一步分解内部表达式,每次都缩进匹配的方括号。如果匹配的方括号对的内容是逗号分隔的(如参数列表或dict文字等),那么Black将首先尝试将它们与匹配的方括号保持在同一行。如果这不起作用,它将把它们放在单独的行中。

eivgtgni

eivgtgni3#

一些解决办法这个讨厌的黑色功能

下面的代码在black下是不变的

#demo.py
coworkers = (
    {}
    + {"amy", "bill", "raj", "satoshi", "jim", "lifeng", "jeff", "sandeep", "mike"}
    + {"john", "hans", "silvester", "gringo", "arold"}
)
$ black --diff demo.py 
All done! ✨ 🍰 ✨
1 file would be left unchanged.

请注意:
1.你需要空的{}
1.将“john”放入前面的集合中将导致换行符行为,因为达到了最大行长度(黑色默认值为88)
1.在集合中不使用尾随逗号。更多信息请访问https://black.readthedocs.io/en/stable/the_black_code_style/current_style.html#the-magic-trailing-comma

jv4diomz

jv4diomz4#

字符串列表/集合的好解决方案

你可以用,字符分割一个字符串。虽然这个解决方案不是通用的,但它有一个很好的紧凑的代码表示。
下面的代码在black下是不变的

# demo.py
coworkers = set(
    (
        "amy,bill,raj,satoshi,jim,lifeng,jeff,sandeep,"
        "mike,john,hans,silvester,gringo,arold"
    ).split(",")
)

黑色:

$ black --diff demo.py 
All done! ✨ 🍰 ✨
1 file would be left unchanged.

从某个变量生成字符串也非常简单:

>>> ','.join(['amy', 'bill'])
'amy,bill'
envsm3lx

envsm3lx5#

这是我对黑色唯一的痛点。其他的一切都是完美无瑕的。我的变通方法有点复杂,但现在开始。
1.我使用Minifier缩小了这个长列表,使用Python Minifier并取消勾选提升文字重命名局部变量重命名全局变量
1.我将这一行粘贴到我的Python文件或随机的Python文件中。
1.我在文件上运行yapf以获得整洁的列表。
1.最后,我将标签fmt: off粘贴在整洁列表之前,然后粘贴fmt:on
是的,这是太多的工作,但至少它得到它完成。

相关问题