Strange indent for chained calls
- Dominant language
- Python
- Stars
- 14k
- Forks
- 904
- PR merge metrics
- No merged PRs in 30d
Description
Hi, faced strange issue on formatting lines with chained calls.
In some cases, first argument kept on first line and chained call is on line with args of previous block.
In other, closing bracket is right under opening bracket, while should be 1 charater right.
```python
from typing import List
# dummy objects
loreipsum_argument_1 = Img = Unic = Piu = SuperPower = Gaboom = object
def package_func(*args, **kwargs):
pass
def reformatted_code():
pass
def main():
# ok/bad case
# original code, or how it should be
reformatted_code()
# ok
# object_prop = package_func(
# loreipsum_argument_1, 'loreipsum_argument_2_abc'
# ).decode()
object_prop = package_func(
loreipsum_argument_1, 'loreipsum_argument_2_abc'
).decode()
# ok
# object_prop = package_func(
# loreipsum_argument_1, 'loreipsum_argument_2_ab',
# ).decode()
object_prop = package_func(
loreipsum_argument_1, 'loreipsum_argument_2_ab',
).decode()
# bad, not well readable
# object_prop = package_func(
# loreipsum_argument_1, 'loreipsum_argument_2'
# ).decode_abcdefghijklmnop()
object_prop = package_func(loreipsum_argument_1,
'loreipsum_argument_2').decode_abcdefghijklmnop()
# almost, but still bad, E124 closing bracket does not match visual indentation,
# closing bracket should be 1 char right
# object_prop = package_func(loreipsum_argument_1, 'loreipsum_argument_2'
# ).decode_abcdefghijklmnop1()
# or
# object_prop = package_func(
# loreipsum_argument_1, 'loreipsum_argument_2'
# ).decode_abcdefghijklmnop1()
object_prop = package_func(loreipsum_argument_1, 'loreipsum_argument_2'
).decode_abcdefghijklmnop1()
# bad
# object_prop=package_func(loreipsum_argument_1,'loreipsum_argument_2').decode()
object_prop = package_func(loreipsum_argument_1,
'loreipsum_argument_2').decode()
# bad
# object_prop=package_func(loreipsum_argument_1,'loreipsum_argument_2',).decode()
object_prop = package_func(loreipsum_argument_1, 'loreipsum_argument_2',
).decode()
# bad, E124
# def some_class_method(cls, user_id, from_date=None):
# if from_date:
# return cls(Img
# ).filter(cls.user_id == user_id, Img.date >= from_date
# ).count()
# return None
def some_class_method(cls, user_id, from_date=None):
if from_date:
return cls(Img
).filter(cls.user_id == user_id,
Img.date >= from_date).count()
return None
# bad
# def some_class_method(cls, user_id, from_date=None):
# if from_date:
# return (
# cls(Img)
# .filter(cls.user_id == user_id, Img.date >= from_date)
# .count()
# )
# return None
def some_class_method(cls, user_id, from_date=None):
if from_date:
return (
cls(Img).filter(cls.user_id == user_id,
Img.date >= from_date).count()
)
return None
# acceptable, the only question is it possible to make like in comment?
# def laser_shooting_unicorn(
# unic: Unic,
# powerups: List[SuperPower],
# is_awesome: bool = True
# ) -> List[SuperPower]:
# pass
def laser_shooting_unicorn(
unic: Unic,
powerups: List[SuperPower],
is_awesome: bool = True
) -> List[SuperPower]:
pass
# something strange, previous variant looks much better
# def laser_shooting_unicorn(unic: Unic, piu: List[Piu], sub: bool = True) -> List[Piu]:
# pass
def laser_shooting_unicorn(unic: Unic,
piu: List[Piu],
sub: bool = True) -> List[Piu]:
pass
# acceptable
# def laser_shooting_unicorn(
# unic: Unic,
# powerups: List[SuperPower],
# sub: bool,
# ) -> List[SuperPower]:
# pass
def laser_shooting_unicorn(
unic: Unic, powerups: List[SuperPower], sub: bool,
) -> List[SuperPower]:
pass
# seems ok, but why not like previous variant which is more readable
# def laser_shooting_unicorn(unic: Unic, gabooms: List[Gaboom], sub: bool) -> List[Gaboom]:
# pass
def laser_shooting_unicorn(unic: Unic, gabooms: List[Gaboom],
sub: bool) -> List[Gaboom]:
pass
```
config
`yapf --style='{based_on_style: google, dedent_closing_brackets: true, disable_ending_comma_heuristic: true}' ./temp.py`
using config like that generates same result
```
[style]
based_on_style = google
dedent_closing_brackets = true
disable_ending_comma_heuristic = true
ALLOW_SPLIT_BEFORE_DEFAULT_OR_NAMED_ASSIGNS = True
ALLOW_SPLIT_BEFORE_DICT_VALUE = True
SPLIT_BEFORE_CLOSING_BRACKET = True
SPLIT_BEFORE_DICT_SET_GENERATOR = True
SPLIT_BEFORE_DOT = True
SPLIT_BEFORE_EXPRESSION_AFTER_OPENING_PAREN = True
SPLIT_BEFORE_FIRST_ARGUMENT = True
SPLIT_BEFORE_LOGICAL_OPERATOR = True
SPLIT_BEFORE_NAMED_ASSIGNS = True
```
` yapf --version 0.29.0`
Contributor guide
Assessment
This issue has not been assessed yet.