From 08f1cdd00b4876b2a0545d46981924d5873a3289 Mon Sep 17 00:00:00 2001 From: Zsolt Dollenstein Date: Sat, 8 Sep 2018 10:34:08 +0100 Subject: [PATCH] Make sure `async for` is not broken up to separate lines (#503) Fixes #372. --- README.md | 2 ++ black.py | 11 ++++++++--- tests/data/python37.py | 28 ++++++++++++++++++++++++++++ 3 files changed, 38 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 9d156fb..d50b13d 100644 --- a/README.md +++ b/README.md @@ -872,6 +872,8 @@ More details can be found in [CONTRIBUTING](CONTRIBUTING.md). * fixed formatting of lambda expressions with default arguments (#468) +* *Black* no longer breaks ``async for`` statements up to separate lines (#372) + ### 18.6b4 diff --git a/black.py b/black.py index 3a51f21..6f7496e 100644 --- a/black.py +++ b/black.py @@ -1889,7 +1889,7 @@ def is_split_after_delimiter(leaf: Leaf, previous: Leaf = None) -> int: def is_split_before_delimiter(leaf: Leaf, previous: Leaf = None) -> int: - """Return the priority of the `leaf` delimiter, given a line before after it. + """Return the priority of the `leaf` delimiter, given a line break before it. The delimiter priorities returned here are from those delimiters that would cause a line break before themselves. @@ -1926,15 +1926,20 @@ def is_split_before_delimiter(leaf: Leaf, previous: Leaf = None) -> int: ): return STRING_PRIORITY - if leaf.type != token.NAME: + if leaf.type not in {token.NAME, token.ASYNC}: return 0 if ( leaf.value == "for" and leaf.parent and leaf.parent.type in {syms.comp_for, syms.old_comp_for} + or leaf.type == token.ASYNC ): - return COMPREHENSION_PRIORITY + if ( + not isinstance(leaf.prev_sibling, Leaf) + or leaf.prev_sibling.value != "async" + ): + return COMPREHENSION_PRIORITY if ( leaf.value == "if" diff --git a/tests/data/python37.py b/tests/data/python37.py index ae20ade..9781ff6 100644 --- a/tests/data/python37.py +++ b/tests/data/python37.py @@ -3,6 +3,17 @@ def f(): return (i*2 async for i in arange(42)) +def g(): + return (something_long * something_long async for something_long in async_generator(with_an_argument)) + +async def func(): + if test: + out_batched = [ + i + async for i in aitertools._async_map( + self.async_inc, arange(8), batch_size=3 + ) + ] # output @@ -11,3 +22,20 @@ def f(): def f(): return (i * 2 async for i in arange(42)) + + +def g(): + return ( + something_long * something_long + async for something_long in async_generator(with_an_argument) + ) + + +async def func(): + if test: + out_batched = [ + i + async for i in aitertools._async_map( + self.async_inc, arange(8), batch_size=3 + ) + ] -- 2.39.2