[925] Improve multiline dictionary and list indentation for sole function parameter (#3964)

This commit is contained in:
Henri Holopainen 2023-10-25 18:35:37 +03:00 committed by GitHub
parent ef1048d5f8
commit 1d4c31aa58
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 325 additions and 13 deletions

View File

@ -12,7 +12,8 @@
### Preview style ### Preview style
<!-- Changes that affect Black's preview style --> - Multiline dictionaries and lists that are the sole argument to a function are now
indented less (#3964)
### Configuration ### Configuration

View File

@ -113,6 +113,32 @@ my_dict = {
} }
``` ```
### Improved multiline dictionary and list indentation for sole function parameter
For better readability and less verticality, _Black_ now pairs parantheses ("(", ")")
with braces ("{", "}") and square brackets ("[", "]") on the same line for single
parameter function calls. For example:
```python
foo(
[
1,
2,
3,
]
)
```
will be changed to:
```python
foo([
1,
2,
3,
])
```
### Improved multiline string handling ### Improved multiline string handling
_Black_ is smarter when formatting multiline strings, especially in function arguments, _Black_ is smarter when formatting multiline strings, especially in function arguments,

View File

@ -815,6 +815,19 @@ def _first_right_hand_split(
tail_leaves.reverse() tail_leaves.reverse()
body_leaves.reverse() body_leaves.reverse()
head_leaves.reverse() head_leaves.reverse()
if Preview.hug_parens_with_braces_and_square_brackets in line.mode:
if (
tail_leaves[0].type == token.RPAR
and tail_leaves[0].value
and tail_leaves[0].opening_bracket is head_leaves[-1]
and body_leaves[-1].type in [token.RBRACE, token.RSQB]
and body_leaves[-1].opening_bracket is body_leaves[0]
):
head_leaves = head_leaves + body_leaves[:1]
tail_leaves = body_leaves[-1:] + tail_leaves
body_leaves = body_leaves[1:-1]
head = bracket_split_build_line( head = bracket_split_build_line(
head_leaves, line, opening_bracket, component=_BracketSplitComponent.head head_leaves, line, opening_bracket, component=_BracketSplitComponent.head
) )

View File

@ -190,6 +190,7 @@ class Preview(Enum):
module_docstring_newlines = auto() module_docstring_newlines = auto()
accept_raw_docstrings = auto() accept_raw_docstrings = auto()
fix_power_op_line_length = auto() fix_power_op_line_length = auto()
hug_parens_with_braces_and_square_brackets = auto()
allow_empty_first_line_before_new_block_or_comment = auto() allow_empty_first_line_before_new_block_or_comment = auto()

View File

@ -0,0 +1,273 @@
# flags: --preview
def foo_brackets(request):
return JsonResponse(
{
"var_1": foo,
"var_2": bar,
}
)
def foo_square_brackets(request):
return JsonResponse(
[
"var_1",
"var_2",
]
)
func({"a": 37, "b": 42, "c": 927, "aaaaaaaaaaaaaaaaaaaaaaaaa": 11111111111111111111111111111111111111111})
func(["random_string_number_one","random_string_number_two","random_string_number_three","random_string_number_four"])
func(
{
# expand me
'a':37,
'b':42,
'c':927
}
)
func(
[
'a',
'b',
'c',
]
)
func( # a
[ # b
"c", # c
"d", # d
"e", # e
] # f
) # g
func( # a
{ # b
"c": 1, # c
"d": 2, # d
"e": 3, # e
} # f
) # g
func(
# preserve me
[
"c",
"d",
"e",
]
)
func(
[ # preserve me but hug brackets
"c",
"d",
"e",
]
)
func(
[
# preserve me but hug brackets
"c",
"d",
"e",
]
)
func(
[
"c",
# preserve me but hug brackets
"d",
"e",
]
)
func(
[
"c",
"d",
"e",
# preserve me but hug brackets
]
)
func(
[
"c",
"d",
"e",
] # preserve me but hug brackets
)
func(
[
"c",
"d",
"e",
]
# preserve me
)
func([x for x in "short line"])
func([x for x in "long line long line long line long line long line long line long line"])
func([x for x in [x for x in "long line long line long line long line long line long line long line"]])
func({"short line"})
func({"long line", "long long line", "long long long line", "long long long long line", "long long long long long line"})
func({{"long line", "long long line", "long long long line", "long long long long line", "long long long long long line"}})
foooooooooooooooooooo(
[{c: n + 1 for c in range(256)} for n in range(100)] + [{}], {size}
)
baaaaaaaaaaaaar(
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10], {x}, "a string", [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
)
# output
def foo_brackets(request):
return JsonResponse({
"var_1": foo,
"var_2": bar,
})
def foo_square_brackets(request):
return JsonResponse([
"var_1",
"var_2",
])
func({
"a": 37,
"b": 42,
"c": 927,
"aaaaaaaaaaaaaaaaaaaaaaaaa": 11111111111111111111111111111111111111111,
})
func([
"random_string_number_one",
"random_string_number_two",
"random_string_number_three",
"random_string_number_four",
])
func({
# expand me
"a": 37,
"b": 42,
"c": 927,
})
func([
"a",
"b",
"c",
])
func([ # a # b
"c", # c
"d", # d
"e", # e
]) # f # g
func({ # a # b
"c": 1, # c
"d": 2, # d
"e": 3, # e
}) # f # g
func(
# preserve me
[
"c",
"d",
"e",
]
)
func([ # preserve me but hug brackets
"c",
"d",
"e",
])
func([
# preserve me but hug brackets
"c",
"d",
"e",
])
func([
"c",
# preserve me but hug brackets
"d",
"e",
])
func([
"c",
"d",
"e",
# preserve me but hug brackets
])
func([
"c",
"d",
"e",
]) # preserve me but hug brackets
func(
[
"c",
"d",
"e",
]
# preserve me
)
func([x for x in "short line"])
func([
x for x in "long line long line long line long line long line long line long line"
])
func([
x
for x in [
x
for x in "long line long line long line long line long line long line long line"
]
])
func({"short line"})
func({
"long line",
"long long line",
"long long long line",
"long long long long line",
"long long long long long line",
})
func({
{
"long line",
"long long line",
"long long long line",
"long long long long line",
"long long long long long line",
}
})
foooooooooooooooooooo(
[{c: n + 1 for c in range(256)} for n in range(100)] + [{}], {size}
)
baaaaaaaaaaaaar(
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10], {x}, "a string", [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
)

View File

@ -962,8 +962,7 @@ def who(self):
) )
xxxxxxx_xxxxxx_xxxxxxx = xxx( xxxxxxx_xxxxxx_xxxxxxx = xxx([
[
xxxxxxxxxxxx( xxxxxxxxxxxx(
xxxxxx_xxxxxxx=( xxxxxx_xxxxxxx=(
'((x.aaaaaaaaa = "xxxxxx.xxxxxxxxxxxxxxxxxxxxx") || (x.xxxxxxxxx =' '((x.aaaaaaaaa = "xxxxxx.xxxxxxxxxxxxxxxxxxxxx") || (x.xxxxxxxxx ='
@ -973,8 +972,7 @@ def who(self):
'"xxx:xxx:xxx::cccccccccccc:xxxxxxx-xxxx/xxxxxxxxxxx/xxxxxxxxxxxxxxxxx") && ' '"xxx:xxx:xxx::cccccccccccc:xxxxxxx-xxxx/xxxxxxxxxxx/xxxxxxxxxxxxxxxxx") && '
) )
) )
] ])
)
if __name__ == "__main__": if __name__ == "__main__":
for i in range(4, 8): for i in range(4, 8):