mirror of https://github.com/astral-sh/ruff
## Summary This PR makes two changes to our formatting of `lambda` expressions: 1. We now parenthesize the body expression if it expands 2. We now try to keep the parameters on a single line The latter of these fixes #8179: Black formatting and this PR's formatting: ```py def a(): return b( c, d, e, f=lambda self, *args, **kwargs: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa( *args, **kwargs ), ) ``` Stable Ruff formatting ```py def a(): return b( c, d, e, f=lambda self, *args, **kwargs: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(*args, **kwargs), ) ``` We don't parenthesize the body expression here because the call to `aaaa...` has its own parentheses, but adding a binary operator shows the new parenthesization: ```diff @@ -3,7 +3,7 @@ c, d, e, - f=lambda self, *args, **kwargs: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa( - *args, **kwargs - ) + 1, + f=lambda self, *args, **kwargs: ( + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(*args, **kwargs) + 1 + ), ) ``` This is actually a new divergence from Black, which formats this input like this: ```py def a(): return b( c, d, e, f=lambda self, *args, **kwargs: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa( *args, **kwargs ) + 1, ) ``` But I think this is an improvement, unlike the case from #8179. One other, smaller benefit is that because we now add parentheses to lambda bodies, we also remove redundant parentheses: ```diff @pytest.mark.parametrize( "f", [ - lambda x: (x.expanding(min_periods=5).cov(x, pairwise=True)), - lambda x: (x.expanding(min_periods=5).corr(x, pairwise=True)), + lambda x: x.expanding(min_periods=5).cov(x, pairwise=True), + lambda x: x.expanding(min_periods=5).corr(x, pairwise=True), ], ) def test_moment_functions_zero_length_pairwise(f): ``` ## Test Plan New tests taken from #8465 and probably a few more I should grab from the ecosystem results. --------- Co-authored-by: Micha Reiser <micha@reiser.io> |
||
|---|---|---|
| .. | ||
| clause.rs | ||
| mod.rs | ||
| stmt_ann_assign.rs | ||
| stmt_assert.rs | ||
| stmt_assign.rs | ||
| stmt_aug_assign.rs | ||
| stmt_break.rs | ||
| stmt_class_def.rs | ||
| stmt_continue.rs | ||
| stmt_delete.rs | ||
| stmt_expr.rs | ||
| stmt_for.rs | ||
| stmt_function_def.rs | ||
| stmt_global.rs | ||
| stmt_if.rs | ||
| stmt_import.rs | ||
| stmt_import_from.rs | ||
| stmt_ipy_escape_command.rs | ||
| stmt_match.rs | ||
| stmt_nonlocal.rs | ||
| stmt_pass.rs | ||
| stmt_raise.rs | ||
| stmt_return.rs | ||
| stmt_try.rs | ||
| stmt_type_alias.rs | ||
| stmt_while.rs | ||
| stmt_with.rs | ||
| suite.rs | ||