Prefer more equal signs before a break when splitting chained assignments (#4010)
Fixes #4007
This commit is contained in:
parent
be336bb67f
commit
fb5e5d2be6
@ -12,8 +12,8 @@
|
|||||||
|
|
||||||
### Preview style
|
### Preview style
|
||||||
|
|
||||||
|
- Prefer more equal signs before a break when splitting chained assignments (#4010)
|
||||||
- Standalone form feed characters at the module level are no longer removed (#4021)
|
- Standalone form feed characters at the module level are no longer removed (#4021)
|
||||||
|
|
||||||
- Additional cases of immediately nested tuples, lists, and dictionaries are now
|
- Additional cases of immediately nested tuples, lists, and dictionaries are now
|
||||||
indented less (#4012)
|
indented less (#4012)
|
||||||
|
|
||||||
|
@ -910,24 +910,32 @@ def _maybe_split_omitting_optional_parens(
|
|||||||
try:
|
try:
|
||||||
# The RHSResult Omitting Optional Parens.
|
# The RHSResult Omitting Optional Parens.
|
||||||
rhs_oop = _first_right_hand_split(line, omit=omit)
|
rhs_oop = _first_right_hand_split(line, omit=omit)
|
||||||
if not (
|
prefer_splitting_rhs_mode = (
|
||||||
Preview.prefer_splitting_right_hand_side_of_assignments in line.mode
|
Preview.prefer_splitting_right_hand_side_of_assignments in line.mode
|
||||||
# the split is right after `=`
|
)
|
||||||
and len(rhs.head.leaves) >= 2
|
is_split_right_after_equal = (
|
||||||
and rhs.head.leaves[-2].type == token.EQUAL
|
len(rhs.head.leaves) >= 2 and rhs.head.leaves[-2].type == token.EQUAL
|
||||||
# the left side of assignment contains brackets
|
)
|
||||||
and any(leaf.type in BRACKETS for leaf in rhs.head.leaves[:-1])
|
rhs_head_contains_brackets = any(
|
||||||
# the left side of assignment is short enough (the -1 is for the ending
|
leaf.type in BRACKETS for leaf in rhs.head.leaves[:-1]
|
||||||
# optional paren)
|
)
|
||||||
and is_line_short_enough(
|
# the -1 is for the ending optional paren
|
||||||
rhs.head, mode=replace(mode, line_length=mode.line_length - 1)
|
rhs_head_short_enough = is_line_short_enough(
|
||||||
|
rhs.head, mode=replace(mode, line_length=mode.line_length - 1)
|
||||||
|
)
|
||||||
|
rhs_head_explode_blocked_by_magic_trailing_comma = (
|
||||||
|
rhs.head.magic_trailing_comma is None
|
||||||
|
)
|
||||||
|
if (
|
||||||
|
not (
|
||||||
|
prefer_splitting_rhs_mode
|
||||||
|
and is_split_right_after_equal
|
||||||
|
and rhs_head_contains_brackets
|
||||||
|
and rhs_head_short_enough
|
||||||
|
and rhs_head_explode_blocked_by_magic_trailing_comma
|
||||||
)
|
)
|
||||||
# the left side of assignment won't explode further because of magic
|
# the omit optional parens split is preferred by some other reason
|
||||||
# trailing comma
|
or _prefer_split_rhs_oop_over_rhs(rhs_oop, rhs, mode)
|
||||||
and rhs.head.magic_trailing_comma is None
|
|
||||||
# the split by omitting optional parens isn't preferred by some other
|
|
||||||
# reason
|
|
||||||
and not _prefer_split_rhs_oop(rhs_oop, mode)
|
|
||||||
):
|
):
|
||||||
yield from _maybe_split_omitting_optional_parens(
|
yield from _maybe_split_omitting_optional_parens(
|
||||||
rhs_oop, line, mode, features=features, omit=omit
|
rhs_oop, line, mode, features=features, omit=omit
|
||||||
@ -935,8 +943,12 @@ def _maybe_split_omitting_optional_parens(
|
|||||||
return
|
return
|
||||||
|
|
||||||
except CannotSplit as e:
|
except CannotSplit as e:
|
||||||
if not (
|
# For chained assignments we want to use the previous successful split
|
||||||
can_be_split(rhs.body) or is_line_short_enough(rhs.body, mode=mode)
|
if line.is_chained_assignment:
|
||||||
|
pass
|
||||||
|
|
||||||
|
elif not can_be_split(rhs.body) and not is_line_short_enough(
|
||||||
|
rhs.body, mode=mode
|
||||||
):
|
):
|
||||||
raise CannotSplit(
|
raise CannotSplit(
|
||||||
"Splitting failed, body is still too long and can't be split."
|
"Splitting failed, body is still too long and can't be split."
|
||||||
@ -960,10 +972,22 @@ def _maybe_split_omitting_optional_parens(
|
|||||||
yield result
|
yield result
|
||||||
|
|
||||||
|
|
||||||
def _prefer_split_rhs_oop(rhs_oop: RHSResult, mode: Mode) -> bool:
|
def _prefer_split_rhs_oop_over_rhs(
|
||||||
|
rhs_oop: RHSResult, rhs: RHSResult, mode: Mode
|
||||||
|
) -> bool:
|
||||||
"""
|
"""
|
||||||
Returns whether we should prefer the result from a split omitting optional parens.
|
Returns whether we should prefer the result from a split omitting optional parens
|
||||||
|
(rhs_oop) over the original (rhs).
|
||||||
"""
|
"""
|
||||||
|
# If we have multiple targets, we prefer more `=`s on the head vs pushing them to
|
||||||
|
# the body
|
||||||
|
rhs_head_equal_count = [leaf.type for leaf in rhs.head.leaves].count(token.EQUAL)
|
||||||
|
rhs_oop_head_equal_count = [leaf.type for leaf in rhs_oop.head.leaves].count(
|
||||||
|
token.EQUAL
|
||||||
|
)
|
||||||
|
if rhs_head_equal_count > 1 and rhs_head_equal_count > rhs_oop_head_equal_count:
|
||||||
|
return False
|
||||||
|
|
||||||
has_closing_bracket_after_assign = False
|
has_closing_bracket_after_assign = False
|
||||||
for leaf in reversed(rhs_oop.head.leaves):
|
for leaf in reversed(rhs_oop.head.leaves):
|
||||||
if leaf.type == token.EQUAL:
|
if leaf.type == token.EQUAL:
|
||||||
|
@ -209,6 +209,11 @@ def is_triple_quoted_string(self) -> bool:
|
|||||||
return True
|
return True
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
@property
|
||||||
|
def is_chained_assignment(self) -> bool:
|
||||||
|
"""Is the line a chained assignment"""
|
||||||
|
return [leaf.type for leaf in self.leaves].count(token.EQUAL) > 1
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def opens_block(self) -> bool:
|
def opens_block(self) -> bool:
|
||||||
"""Does this line open a new level of indentation."""
|
"""Does this line open a new level of indentation."""
|
||||||
|
@ -84,3 +84,24 @@
|
|||||||
) or (
|
) or (
|
||||||
isinstance(some_other_var, BaseClass) and table.something != table.some_other_thing
|
isinstance(some_other_var, BaseClass) and table.something != table.some_other_thing
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# Multiple targets
|
||||||
|
a = b = (
|
||||||
|
ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
|
||||||
|
)
|
||||||
|
|
||||||
|
a = b = c = d = e = f = g = (
|
||||||
|
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||||
|
) = i = j = (
|
||||||
|
kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk
|
||||||
|
)
|
||||||
|
|
||||||
|
a = (
|
||||||
|
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
|
||||||
|
) = c
|
||||||
|
|
||||||
|
a = (
|
||||||
|
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
|
||||||
|
) = (
|
||||||
|
cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
|
||||||
|
) = ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
|
||||||
|
Loading…
Reference in New Issue
Block a user