Delimit multiline expressions according to math operator priority
Fixes #148
This commit is contained in:
parent
1747c388bb
commit
7811f957f3
@ -540,6 +540,9 @@ More details can be found in [CONTRIBUTING](CONTRIBUTING.md).
|
||||
|
||||
* slices are now formatted according to PEP 8 (#178)
|
||||
|
||||
* math operators now use their respective priorities for delimiting multiline
|
||||
expressions (#148)
|
||||
|
||||
* empty parentheses in a class definition are now removed (#145, #180)
|
||||
|
||||
* fixed an invalid trailing comma sometimes left in imports (#185)
|
||||
|
46
black.py
46
black.py
@ -553,19 +553,20 @@ def show(cls, code: str) -> None:
|
||||
token.GREATEREQUAL,
|
||||
}
|
||||
MATH_OPERATORS = {
|
||||
token.VBAR,
|
||||
token.CIRCUMFLEX,
|
||||
token.AMPER,
|
||||
token.LEFTSHIFT,
|
||||
token.RIGHTSHIFT,
|
||||
token.PLUS,
|
||||
token.MINUS,
|
||||
token.STAR,
|
||||
token.SLASH,
|
||||
token.VBAR,
|
||||
token.AMPER,
|
||||
token.PERCENT,
|
||||
token.CIRCUMFLEX,
|
||||
token.TILDE,
|
||||
token.LEFTSHIFT,
|
||||
token.RIGHTSHIFT,
|
||||
token.DOUBLESTAR,
|
||||
token.DOUBLESLASH,
|
||||
token.PERCENT,
|
||||
token.AT,
|
||||
token.TILDE,
|
||||
token.DOUBLESTAR,
|
||||
}
|
||||
STARS = {token.STAR, token.DOUBLESTAR}
|
||||
VARARGS_PARENTS = {
|
||||
@ -599,12 +600,27 @@ def show(cls, code: str) -> None:
|
||||
syms.power,
|
||||
}
|
||||
COMPREHENSION_PRIORITY = 20
|
||||
COMMA_PRIORITY = 10
|
||||
TERNARY_PRIORITY = 7
|
||||
LOGIC_PRIORITY = 5
|
||||
STRING_PRIORITY = 4
|
||||
COMPARATOR_PRIORITY = 3
|
||||
MATH_PRIORITY = 1
|
||||
COMMA_PRIORITY = 18
|
||||
TERNARY_PRIORITY = 16
|
||||
LOGIC_PRIORITY = 14
|
||||
STRING_PRIORITY = 12
|
||||
COMPARATOR_PRIORITY = 10
|
||||
MATH_PRIORITIES = {
|
||||
token.VBAR: 8,
|
||||
token.CIRCUMFLEX: 7,
|
||||
token.AMPER: 6,
|
||||
token.LEFTSHIFT: 5,
|
||||
token.RIGHTSHIFT: 5,
|
||||
token.PLUS: 4,
|
||||
token.MINUS: 4,
|
||||
token.STAR: 3,
|
||||
token.SLASH: 3,
|
||||
token.DOUBLESLASH: 3,
|
||||
token.PERCENT: 3,
|
||||
token.AT: 3,
|
||||
token.TILDE: 2,
|
||||
token.DOUBLESTAR: 1,
|
||||
}
|
||||
|
||||
|
||||
@dataclass
|
||||
@ -1649,7 +1665,7 @@ def is_split_before_delimiter(leaf: Leaf, previous: Leaf = None) -> int:
|
||||
and leaf.parent
|
||||
and leaf.parent.type not in {syms.factor, syms.star_expr}
|
||||
):
|
||||
return MATH_PRIORITY
|
||||
return MATH_PRIORITIES[leaf.type]
|
||||
|
||||
if leaf.type in COMPARATORS:
|
||||
return COMPARATOR_PRIORITY
|
||||
|
@ -129,7 +129,7 @@
|
||||
]
|
||||
slice[0]
|
||||
slice[0:1]
|
||||
@@ -123,91 +145,119 @@
|
||||
@@ -123,103 +145,140 @@
|
||||
numpy[-(c + 1) :, d]
|
||||
numpy[:, l[-2]]
|
||||
numpy[:, ::-1]
|
||||
@ -244,6 +244,18 @@
|
||||
-if (
|
||||
- aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa /
|
||||
- aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
|
||||
-):
|
||||
- return True
|
||||
-if (
|
||||
- ~ aaaa.a + aaaa.b - aaaa.c * aaaa.d / aaaa.e | aaaa.f & aaaa.g % aaaa.h ^ aaaa.i << aaaa.k >> aaaa.l ** aaaa.m // aaaa.n
|
||||
-):
|
||||
- return True
|
||||
-if (
|
||||
- ~ aaaaaaaa.a + aaaaaaaa.b - aaaaaaaa.c @ aaaaaaaa.d / aaaaaaaa.e | aaaaaaaa.f & aaaaaaaa.g % aaaaaaaa.h ^ aaaaaaaa.i << aaaaaaaa.k >> aaaaaaaa.l ** aaaaaaaa.m // aaaaaaaa.n
|
||||
-):
|
||||
- return True
|
||||
-if (
|
||||
- ~ aaaaaaaaaaaaaaaa.a + aaaaaaaaaaaaaaaa.b - aaaaaaaaaaaaaaaa.c * aaaaaaaaaaaaaaaa.d @ aaaaaaaaaaaaaaaa.e | aaaaaaaaaaaaaaaa.f & aaaaaaaaaaaaaaaa.g % aaaaaaaaaaaaaaaa.h ^ aaaaaaaaaaaaaaaa.i << aaaaaaaaaaaaaaaa.k >> aaaaaaaaaaaaaaaa.l ** aaaaaaaaaaaaaaaa.m // aaaaaaaaaaaaaaaa.n
|
||||
+print(*lambda x: x)
|
||||
+assert not Test, "Short message"
|
||||
+assert (
|
||||
@ -296,6 +308,27 @@
|
||||
+if (
|
||||
+ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
|
||||
+ / aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
|
||||
+):
|
||||
+ return True
|
||||
+if (
|
||||
+ ~aaaa.a + aaaa.b - aaaa.c * aaaa.d / aaaa.e
|
||||
+ | aaaa.f & aaaa.g % aaaa.h ^ aaaa.i << aaaa.k >> aaaa.l ** aaaa.m // aaaa.n
|
||||
+):
|
||||
+ return True
|
||||
+if (
|
||||
+ ~aaaaaaaa.a + aaaaaaaa.b - aaaaaaaa.c @ aaaaaaaa.d / aaaaaaaa.e
|
||||
+ | aaaaaaaa.f & aaaaaaaa.g % aaaaaaaa.h
|
||||
+ ^ aaaaaaaa.i << aaaaaaaa.k >> aaaaaaaa.l ** aaaaaaaa.m // aaaaaaaa.n
|
||||
+):
|
||||
+ return True
|
||||
+if (
|
||||
+ ~aaaaaaaaaaaaaaaa.a
|
||||
+ + aaaaaaaaaaaaaaaa.b
|
||||
+ - aaaaaaaaaaaaaaaa.c * aaaaaaaaaaaaaaaa.d @ aaaaaaaaaaaaaaaa.e
|
||||
+ | aaaaaaaaaaaaaaaa.f & aaaaaaaaaaaaaaaa.g % aaaaaaaaaaaaaaaa.h
|
||||
+ ^ aaaaaaaaaaaaaaaa.i
|
||||
+ << aaaaaaaaaaaaaaaa.k
|
||||
+ >> aaaaaaaaaaaaaaaa.l ** aaaaaaaaaaaaaaaa.m // aaaaaaaaaaaaaaaa.n
|
||||
):
|
||||
return True
|
||||
last_call()
|
||||
|
@ -208,6 +208,18 @@ async def f():
|
||||
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
|
||||
):
|
||||
return True
|
||||
if (
|
||||
~ aaaa.a + aaaa.b - aaaa.c * aaaa.d / aaaa.e | aaaa.f & aaaa.g % aaaa.h ^ aaaa.i << aaaa.k >> aaaa.l ** aaaa.m // aaaa.n
|
||||
):
|
||||
return True
|
||||
if (
|
||||
~ aaaaaaaa.a + aaaaaaaa.b - aaaaaaaa.c @ aaaaaaaa.d / aaaaaaaa.e | aaaaaaaa.f & aaaaaaaa.g % aaaaaaaa.h ^ aaaaaaaa.i << aaaaaaaa.k >> aaaaaaaa.l ** aaaaaaaa.m // aaaaaaaa.n
|
||||
):
|
||||
return True
|
||||
if (
|
||||
~ aaaaaaaaaaaaaaaa.a + aaaaaaaaaaaaaaaa.b - aaaaaaaaaaaaaaaa.c * aaaaaaaaaaaaaaaa.d @ aaaaaaaaaaaaaaaa.e | aaaaaaaaaaaaaaaa.f & aaaaaaaaaaaaaaaa.g % aaaaaaaaaaaaaaaa.h ^ aaaaaaaaaaaaaaaa.i << aaaaaaaaaaaaaaaa.k >> aaaaaaaaaaaaaaaa.l ** aaaaaaaaaaaaaaaa.m // aaaaaaaaaaaaaaaa.n
|
||||
):
|
||||
return True
|
||||
last_call()
|
||||
# standalone comment at ENDMARKER
|
||||
|
||||
@ -475,5 +487,26 @@ async def f():
|
||||
/ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
|
||||
):
|
||||
return True
|
||||
if (
|
||||
~aaaa.a + aaaa.b - aaaa.c * aaaa.d / aaaa.e
|
||||
| aaaa.f & aaaa.g % aaaa.h ^ aaaa.i << aaaa.k >> aaaa.l ** aaaa.m // aaaa.n
|
||||
):
|
||||
return True
|
||||
if (
|
||||
~aaaaaaaa.a + aaaaaaaa.b - aaaaaaaa.c @ aaaaaaaa.d / aaaaaaaa.e
|
||||
| aaaaaaaa.f & aaaaaaaa.g % aaaaaaaa.h
|
||||
^ aaaaaaaa.i << aaaaaaaa.k >> aaaaaaaa.l ** aaaaaaaa.m // aaaaaaaa.n
|
||||
):
|
||||
return True
|
||||
if (
|
||||
~aaaaaaaaaaaaaaaa.a
|
||||
+ aaaaaaaaaaaaaaaa.b
|
||||
- aaaaaaaaaaaaaaaa.c * aaaaaaaaaaaaaaaa.d @ aaaaaaaaaaaaaaaa.e
|
||||
| aaaaaaaaaaaaaaaa.f & aaaaaaaaaaaaaaaa.g % aaaaaaaaaaaaaaaa.h
|
||||
^ aaaaaaaaaaaaaaaa.i
|
||||
<< aaaaaaaaaaaaaaaa.k
|
||||
>> aaaaaaaaaaaaaaaa.l ** aaaaaaaaaaaaaaaa.m // aaaaaaaaaaaaaaaa.n
|
||||
):
|
||||
return True
|
||||
last_call()
|
||||
# standalone comment at ENDMARKER
|
||||
|
Loading…
Reference in New Issue
Block a user