google / google/yapf

Strange indent for chained calls

Open
#788 0 comments 0 reactions 0 assignees View on GitHub
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

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.