Omit tuple parentheses inside comprehensions (#5790)

This commit is contained in:
Chris Pryer 2023-07-19 08:05:38 -04:00 committed by GitHub
parent 38678142ed
commit 9fb8d6e999
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 198 additions and 42 deletions

View File

@ -43,3 +43,35 @@
if if
gggggggggggggggggggggggggggggggggggggggggggg gggggggggggggggggggggggggggggggggggggggggggg
} }
# Useful for tuple target (see https://github.com/astral-sh/ruff/issues/5779#issuecomment-1637614763)
{k: v for a, a, a, a, a, a, a, a, a, a, [a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a] in this_is_a_very_long_variable_which_will_cause_a_trailing_comma_which_breaks_the_comprehension}
{k: v for a, a, a, a, a, a, a, a, a, a, (a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a,) in this_is_a_very_long_variable_which_will_cause_a_trailing_comma_which_breaks_the_comprehension}
# Leading
{ # Leading
k: v # Trailing
for a, a, a, a, a, a, a, a, a, a, ( # Trailing
a,
a,
a,
a,
a,
a,
a,
a,
a, # Trailing
a,
a,
a,
a,
a,
a,
a,
a,
a,
a,
a, # Trailing
) in this_is_a_very_long_variable_which_will_cause_a_trailing_comma_which_breaks_the_comprehension # Trailing
} # Trailing
# Trailing

View File

@ -14,6 +14,9 @@ use crate::prelude::*;
#[derive(Eq, PartialEq, Debug, Default)] #[derive(Eq, PartialEq, Debug, Default)]
pub enum TupleParentheses { pub enum TupleParentheses {
/// Black omits parentheses for tuples inside of comprehensions.
Comprehension,
/// Effectively `None` in `Option<Parentheses>` /// Effectively `None` in `Option<Parentheses>`
#[default] #[default]
Default, Default,
@ -116,6 +119,13 @@ impl FormatNodeRule<ExprTuple> for FormatExprTuple {
parenthesized("(", &ExprSequence::new(item), ")").fmt(f) parenthesized("(", &ExprSequence::new(item), ")").fmt(f)
} }
_ => match self.parentheses { _ => match self.parentheses {
TupleParentheses::Comprehension => {
let separator =
format_with(|f| group(&format_args![text(","), space()]).fmt(f));
f.join_with(separator)
.entries(elts.iter().formatted())
.finish()
}
TupleParentheses::Subscript => group(&ExprSequence::new(item)).fmt(f), TupleParentheses::Subscript => group(&ExprSequence::new(item)).fmt(f),
_ => parenthesize_if_expands(&ExprSequence::new(item)).fmt(f), _ => parenthesize_if_expands(&ExprSequence::new(item)).fmt(f),
}, },

View File

@ -1,4 +1,5 @@
use crate::comments::{leading_comments, trailing_comments}; use crate::comments::{leading_comments, trailing_comments};
use crate::expression::expr_tuple::TupleParentheses;
use crate::prelude::*; use crate::prelude::*;
use crate::AsFormat; use crate::AsFormat;
use crate::{FormatNodeRule, PyFormatter}; use crate::{FormatNodeRule, PyFormatter};
@ -58,7 +59,7 @@ impl FormatNodeRule<Comprehension> for FormatComprehension {
trailing_comments(before_target_comments), trailing_comments(before_target_comments),
group(&format_args!( group(&format_args!(
Spacer(target), Spacer(target),
target.format(), ExprTupleWithoutParentheses(target),
in_spacer, in_spacer,
leading_comments(before_in_comments), leading_comments(before_in_comments),
text("in"), text("in"),
@ -104,3 +105,17 @@ impl FormatNodeRule<Comprehension> for FormatComprehension {
Ok(()) Ok(())
} }
} }
struct ExprTupleWithoutParentheses<'a>(&'a Expr);
impl Format<PyFormatContext<'_>> for ExprTupleWithoutParentheses<'_> {
fn fmt(&self, f: &mut Formatter<PyFormatContext<'_>>) -> FormatResult<()> {
match self.0 {
Expr::Tuple(expr_tuple) => expr_tuple
.format()
.with_options(TupleParentheses::Comprehension)
.fmt(f),
other => other.format().fmt(f),
}
}
}

View File

@ -314,19 +314,7 @@ last_call()
() ()
(1,) (1,)
(1, 2) (1, 2)
@@ -101,7 +108,10 @@ @@ -115,7 +122,7 @@
{a: b * -2 for a, b in dictionary.items()}
{
k: v
- for k, v in this_is_a_very_long_variable_which_will_cause_a_trailing_comma_which_breaks_the_comprehension
+ for (
+ k,
+ v,
+ ) in this_is_a_very_long_variable_which_will_cause_a_trailing_comma_which_breaks_the_comprehension
}
Python3 > Python2 > COBOL
Life is Life
@@ -115,7 +125,7 @@
arg, arg,
another, another,
kwarg="hey", kwarg="hey",
@ -335,7 +323,7 @@ last_call()
) # note: no trailing comma pre-3.6 ) # note: no trailing comma pre-3.6
call(*gidgets[:2]) call(*gidgets[:2])
call(a, *gidgets[:2]) call(a, *gidgets[:2])
@@ -152,13 +162,13 @@ @@ -152,13 +159,13 @@
slice[0:1] slice[0:1]
slice[0:1:2] slice[0:1:2]
slice[:] slice[:]
@ -352,7 +340,7 @@ last_call()
numpy[0, :] numpy[0, :]
numpy[:, i] numpy[:, i]
numpy[0, :2] numpy[0, :2]
@@ -172,7 +182,7 @@ @@ -172,7 +179,7 @@
numpy[1 : c + 1, c] numpy[1 : c + 1, c]
numpy[-(c + 1) :, d] numpy[-(c + 1) :, d]
numpy[:, l[-2]] numpy[:, l[-2]]
@ -361,10 +349,11 @@ last_call()
numpy[np.newaxis, :] numpy[np.newaxis, :]
(str or None) if (sys.version_info[0] > (3,)) else (str or bytes or None) (str or None) if (sys.version_info[0] > (3,)) else (str or bytes or None)
{"2.7": dead, "3.7": long_live or die_hard} {"2.7": dead, "3.7": long_live or die_hard}
@@ -208,24 +218,14 @@ @@ -207,25 +214,15 @@
)
what_is_up_with_those_new_coord_names = (coord_names | set(vars_to_create)) - set( what_is_up_with_those_new_coord_names = (coord_names | set(vars_to_create)) - set(
vars_to_remove vars_to_remove
) -)
-result = ( -result = (
- session.query(models.Customer.id) - session.query(models.Customer.id)
- .filter( - .filter(
@ -372,7 +361,7 @@ last_call()
- ) - )
- .order_by(models.Customer.id.asc()) - .order_by(models.Customer.id.asc())
- .all() - .all()
-) )
-result = ( -result = (
- session.query(models.Customer.id) - session.query(models.Customer.id)
- .filter( - .filter(
@ -394,7 +383,7 @@ last_call()
Ø = set() Ø = set()
authors.łukasz.say_thanks() authors.łukasz.say_thanks()
mapping = { mapping = {
@@ -237,10 +237,10 @@ @@ -237,10 +234,10 @@
def gen(): def gen():
@ -409,7 +398,7 @@ last_call()
async def f(): async def f():
@@ -328,13 +328,18 @@ @@ -328,13 +325,18 @@
): ):
return True return True
if ( if (
@ -431,7 +420,7 @@ last_call()
^ aaaaaaaa.i << aaaaaaaa.k >> aaaaaaaa.l**aaaaaaaa.m // aaaaaaaa.n ^ aaaaaaaa.i << aaaaaaaa.k >> aaaaaaaa.l**aaaaaaaa.m // aaaaaaaa.n
): ):
return True return True
@@ -342,7 +347,8 @@ @@ -342,7 +344,8 @@
~aaaaaaaaaaaaaaaa.a ~aaaaaaaaaaaaaaaa.a
+ aaaaaaaaaaaaaaaa.b + aaaaaaaaaaaaaaaa.b
- aaaaaaaaaaaaaaaa.c * aaaaaaaaaaaaaaaa.d @ aaaaaaaaaaaaaaaa.e - aaaaaaaaaaaaaaaa.c * aaaaaaaaaaaaaaaa.d @ aaaaaaaaaaaaaaaa.e
@ -556,10 +545,7 @@ str or None if (1 if True else 2) else str or bytes or None
{a: b * -2 for a, b in dictionary.items()} {a: b * -2 for a, b in dictionary.items()}
{ {
k: v k: v
for ( for k, v in this_is_a_very_long_variable_which_will_cause_a_trailing_comma_which_breaks_the_comprehension
k,
v,
) in this_is_a_very_long_variable_which_will_cause_a_trailing_comma_which_breaks_the_comprehension
} }
Python3 > Python2 > COBOL Python3 > Python2 > COBOL
Life is Life Life is Life

View File

@ -49,7 +49,38 @@ input_file: crates/ruff_python_formatter/resources/test/fixtures/ruff/expression
if if
gggggggggggggggggggggggggggggggggggggggggggg gggggggggggggggggggggggggggggggggggggggggggg
} }
```
# Useful for tuple target (see https://github.com/astral-sh/ruff/issues/5779#issuecomment-1637614763)
{k: v for a, a, a, a, a, a, a, a, a, a, [a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a] in this_is_a_very_long_variable_which_will_cause_a_trailing_comma_which_breaks_the_comprehension}
{k: v for a, a, a, a, a, a, a, a, a, a, (a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a,) in this_is_a_very_long_variable_which_will_cause_a_trailing_comma_which_breaks_the_comprehension}
# Leading
{ # Leading
k: v # Trailing
for a, a, a, a, a, a, a, a, a, a, ( # Trailing
a,
a,
a,
a,
a,
a,
a,
a,
a, # Trailing
a,
a,
a,
a,
a,
a,
a,
a,
a,
a,
a, # Trailing
) in this_is_a_very_long_variable_which_will_cause_a_trailing_comma_which_breaks_the_comprehension # Trailing
} # Trailing
# Trailing```
## Output ## Output
```py ```py
@ -95,16 +126,97 @@ input_file: crates/ruff_python_formatter/resources/test/fixtures/ruff/expression
dddddddddddddddddd, dddddddddddddddddd,
eeeeeeeeeeeeeeeeeee, eeeeeeeeeeeeeeeeeee,
]: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ]: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
for ( for ccccccccccccccccccccccccccccccccccccccc, ddddddddddddddddddd, [
ccccccccccccccccccccccccccccccccccccccc, eeeeeeeeeeeeeeeeeeeeee,
ddddddddddddddddddd, fffffffffffffffffffffffff,
[eeeeeeeeeeeeeeeeeeeeee, fffffffffffffffffffffffff], ] in eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeffffffffffffffffffffffffggggggggggggggggggggghhhhhhhhhhhhhhothermoreeand_even_moreddddddddddddddddddddd
) in eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeffffffffffffffffffffffffggggggggggggggggggggghhhhhhhhhhhhhhothermoreeand_even_moreddddddddddddddddddddd
if fffffffffffffffffffffffffffffffffffffffffff if fffffffffffffffffffffffffffffffffffffffffff
< gggggggggggggggggggggggggggggggggggggggggggggg < gggggggggggggggggggggggggggggggggggggggggggggg
< hhhhhhhhhhhhhhhhhhhhhhhhhh < hhhhhhhhhhhhhhhhhhhhhhhhhh
if gggggggggggggggggggggggggggggggggggggggggggg if gggggggggggggggggggggggggggggggggggggggggggg
} }
# Useful for tuple target (see https://github.com/astral-sh/ruff/issues/5779#issuecomment-1637614763)
{
k: v
for a, a, a, a, a, a, a, a, a, a, [
a,
a,
a,
a,
a,
a,
a,
a,
a,
a,
a,
a,
a,
a,
a,
a,
a,
a,
a,
a,
] in this_is_a_very_long_variable_which_will_cause_a_trailing_comma_which_breaks_the_comprehension
}
{
k: v
for a, a, a, a, a, a, a, a, a, a, (
a,
a,
a,
a,
a,
a,
a,
a,
a,
a,
a,
a,
a,
a,
a,
a,
a,
a,
a,
a,
) in this_is_a_very_long_variable_which_will_cause_a_trailing_comma_which_breaks_the_comprehension
}
# Leading
{
# Leading
k: v # Trailing
for a, a, a, a, a, a, a, a, a, a, (
# Trailing
a,
a,
a,
a,
a,
a,
a,
a,
a, # Trailing
a,
a,
a,
a,
a,
a,
a,
a,
a,
a,
a, # Trailing
) in this_is_a_very_long_variable_which_will_cause_a_trailing_comma_which_breaks_the_comprehension # Trailing
} # Trailing
# Trailing
``` ```

View File

@ -92,11 +92,10 @@ input_file: crates/ruff_python_formatter/resources/test/fixtures/ruff/expression
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+ bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
+ [dddddddddddddddddd, eeeeeeeeeeeeeeeeeee] + [dddddddddddddddddd, eeeeeeeeeeeeeeeeeee]
for ( for ccccccccccccccccccccccccccccccccccccccc, ddddddddddddddddddd, [
ccccccccccccccccccccccccccccccccccccccc, eeeeeeeeeeeeeeeeeeeeee,
ddddddddddddddddddd, fffffffffffffffffffffffff,
[eeeeeeeeeeeeeeeeeeeeee, fffffffffffffffffffffffff], ] in eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeffffffffffffffffffffffffggggggggggggggggggggghhhhhhhhhhhhhhothermoreeand_even_moreddddddddddddddddddddd
) in eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeffffffffffffffffffffffffggggggggggggggggggggghhhhhhhhhhhhhhothermoreeand_even_moreddddddddddddddddddddd
if fffffffffffffffffffffffffffffffffffffffffff if fffffffffffffffffffffffffffffffffffffffffff
< gggggggggggggggggggggggggggggggggggggggggggggg < gggggggggggggggggggggggggggggggggggggggggggggg
< hhhhhhhhhhhhhhhhhhhhhhhhhh < hhhhhhhhhhhhhhhhhhhhhhhhhh

View File

@ -92,14 +92,16 @@ input_file: crates/ruff_python_formatter/resources/test/fixtures/ruff/expression
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+ bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
+ [dddddddddddddddddd, eeeeeeeeeeeeeeeeeee] + [dddddddddddddddddd, eeeeeeeeeeeeeeeeeee]
for ( for ccccccccccccccccccccccccccccccccccccccc, ddddddddddddddddddd, [
ccccccccccccccccccccccccccccccccccccccc, eeeeeeeeeeeeeeeeeeeeee,
ddddddddddddddddddd, fffffffffffffffffffffffff,
[eeeeeeeeeeeeeeeeeeeeee, fffffffffffffffffffffffff], ] in eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeffffffffffffffffffffffffggggggggggggggggggggghhhhhhhhhhhhhhothermoreeand_even_moreddddddddddddddddddddd
) in eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeffffffffffffffffffffffffggggggggggggggggggggghhhhhhhhhhhhhhothermoreeand_even_moreddddddddddddddddddddd
if fffffffffffffffffffffffffffffffffffffffffff if fffffffffffffffffffffffffffffffffffffffffff
< gggggggggggggggggggggggggggggggggggggggggggggg < gggggggggggggggggggggggggggggggggggggggggggggg
< hhhhhhhhhhhhhhhhhhhhhhhhhh < hhhhhhhhhhhhhhhhhhhhhhhhhh
if gggggggggggggggggggggggggggggggggggggggggggg if gggggggggggggggggggggggggggggggggggggggggggg
} }
``` ```