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
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)]
pub enum TupleParentheses {
/// Black omits parentheses for tuples inside of comprehensions.
Comprehension,
/// Effectively `None` in `Option<Parentheses>`
#[default]
Default,
@ -116,6 +119,13 @@ impl FormatNodeRule<ExprTuple> for FormatExprTuple {
parenthesized("(", &ExprSequence::new(item), ")").fmt(f)
}
_ => 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),
_ => parenthesize_if_expands(&ExprSequence::new(item)).fmt(f),
},

View file

@ -1,4 +1,5 @@
use crate::comments::{leading_comments, trailing_comments};
use crate::expression::expr_tuple::TupleParentheses;
use crate::prelude::*;
use crate::AsFormat;
use crate::{FormatNodeRule, PyFormatter};
@ -58,7 +59,7 @@ impl FormatNodeRule<Comprehension> for FormatComprehension {
trailing_comments(before_target_comments),
group(&format_args!(
Spacer(target),
target.format(),
ExprTupleWithoutParentheses(target),
in_spacer,
leading_comments(before_in_comments),
text("in"),
@ -104,3 +105,17 @@ impl FormatNodeRule<Comprehension> for FormatComprehension {
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, 2)
@@ -101,7 +108,10 @@
{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 @@
@@ -115,7 +122,7 @@
arg,
another,
kwarg="hey",
@ -335,7 +323,7 @@ last_call()
) # note: no trailing comma pre-3.6
call(*gidgets[:2])
call(a, *gidgets[:2])
@@ -152,13 +162,13 @@
@@ -152,13 +159,13 @@
slice[0:1]
slice[0:1:2]
slice[:]
@ -352,7 +340,7 @@ last_call()
numpy[0, :]
numpy[:, i]
numpy[0, :2]
@@ -172,7 +182,7 @@
@@ -172,7 +179,7 @@
numpy[1 : c + 1, c]
numpy[-(c + 1) :, d]
numpy[:, l[-2]]
@ -361,10 +349,11 @@ last_call()
numpy[np.newaxis, :]
(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}
@@ -208,24 +218,14 @@
@@ -207,25 +214,15 @@
)
what_is_up_with_those_new_coord_names = (coord_names | set(vars_to_create)) - set(
vars_to_remove
)
-)
-result = (
- session.query(models.Customer.id)
- .filter(
@ -372,7 +361,7 @@ last_call()
- )
- .order_by(models.Customer.id.asc())
- .all()
-)
)
-result = (
- session.query(models.Customer.id)
- .filter(
@ -394,7 +383,7 @@ last_call()
Ø = set()
authors.łukasz.say_thanks()
mapping = {
@@ -237,10 +237,10 @@
@@ -237,10 +234,10 @@
def gen():
@ -409,7 +398,7 @@ last_call()
async def f():
@@ -328,13 +328,18 @@
@@ -328,13 +325,18 @@
):
return True
if (
@ -431,7 +420,7 @@ last_call()
^ aaaaaaaa.i << aaaaaaaa.k >> aaaaaaaa.l**aaaaaaaa.m // aaaaaaaa.n
):
return True
@@ -342,7 +347,8 @@
@@ -342,7 +344,8 @@
~aaaaaaaaaaaaaaaa.a
+ aaaaaaaaaaaaaaaa.b
- 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()}
{
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

View file

@ -49,7 +49,38 @@ input_file: crates/ruff_python_formatter/resources/test/fixtures/ruff/expression
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```
## Output
```py
@ -95,16 +126,97 @@ input_file: crates/ruff_python_formatter/resources/test/fixtures/ruff/expression
dddddddddddddddddd,
eeeeeeeeeeeeeeeeeee,
]: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
for (
ccccccccccccccccccccccccccccccccccccccc,
ddddddddddddddddddd,
[eeeeeeeeeeeeeeeeeeeeee, fffffffffffffffffffffffff],
) in eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeffffffffffffffffffffffffggggggggggggggggggggghhhhhhhhhhhhhhothermoreeand_even_moreddddddddddddddddddddd
for ccccccccccccccccccccccccccccccccccccccc, ddddddddddddddddddd, [
eeeeeeeeeeeeeeeeeeeeee,
fffffffffffffffffffffffff,
] in eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeffffffffffffffffffffffffggggggggggggggggggggghhhhhhhhhhhhhhothermoreeand_even_moreddddddddddddddddddddd
if fffffffffffffffffffffffffffffffffffffffffff
< gggggggggggggggggggggggggggggggggggggggggggggg
< hhhhhhhhhhhhhhhhhhhhhhhhhh
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
+ bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
+ [dddddddddddddddddd, eeeeeeeeeeeeeeeeeee]
for (
ccccccccccccccccccccccccccccccccccccccc,
ddddddddddddddddddd,
[eeeeeeeeeeeeeeeeeeeeee, fffffffffffffffffffffffff],
) in eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeffffffffffffffffffffffffggggggggggggggggggggghhhhhhhhhhhhhhothermoreeand_even_moreddddddddddddddddddddd
for ccccccccccccccccccccccccccccccccccccccc, ddddddddddddddddddd, [
eeeeeeeeeeeeeeeeeeeeee,
fffffffffffffffffffffffff,
] in eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeffffffffffffffffffffffffggggggggggggggggggggghhhhhhhhhhhhhhothermoreeand_even_moreddddddddddddddddddddd
if fffffffffffffffffffffffffffffffffffffffffff
< gggggggggggggggggggggggggggggggggggggggggggggg
< hhhhhhhhhhhhhhhhhhhhhhhhhh

View file

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