mirror of https://github.com/astral-sh/ruff
Omit tuple parentheses inside comprehensions (#5790)
This commit is contained in:
parent
38678142ed
commit
9fb8d6e999
|
|
@ -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
|
||||||
|
|
@ -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),
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -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),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue