Skip to content

Commit

Permalink
Unpacking on flow constructs (return/yield) now implies 3.8+
Browse files Browse the repository at this point in the history
  • Loading branch information
isidentical committed Dec 15, 2021
1 parent 3501cef commit 2de9726
Show file tree
Hide file tree
Showing 4 changed files with 21 additions and 0 deletions.
1 change: 1 addition & 0 deletions CHANGES.md
Expand Up @@ -11,6 +11,7 @@
(#2686)
- No longer color diff headers white as it's unreadable in light themed terminals
(#2691)
- Tuple unpacking on `return` and `yield` constructs now implies 3.8+ (#2700)

## 21.12b0

Expand Down
8 changes: 8 additions & 0 deletions src/black/__init__.py
Expand Up @@ -1210,6 +1210,14 @@ def get_features_used( # noqa: C901
if argch.type in STARS:
features.add(feature)

elif (
n.type in {syms.return_stmt, syms.yield_expr}
and len(n.children) >= 2
and n.children[1].type == syms.testlist_star_expr
and any(child.type == syms.star_expr for child in n.children[1].children)
):
features.add(Feature.UNPACKING_ON_FLOW)

# Python 2 only features (for its deprecation) except for integers, see above
elif n.type == syms.print_stmt:
features.add(Feature.PRINT_STMT)
Expand Down
4 changes: 4 additions & 0 deletions src/black/mode.py
Expand Up @@ -49,6 +49,7 @@ class Feature(Enum):
POS_ONLY_ARGUMENTS = 9
RELAXED_DECORATORS = 10
PATTERN_MATCHING = 11
UNPACKING_ON_FLOW = 12
FORCE_OPTIONAL_PARENTHESES = 50

# __future__ flags
Expand Down Expand Up @@ -116,6 +117,7 @@ class Feature(Enum):
Feature.FUTURE_ANNOTATIONS,
Feature.ASSIGNMENT_EXPRESSIONS,
Feature.POS_ONLY_ARGUMENTS,
Feature.UNPACKING_ON_FLOW,
},
TargetVersion.PY39: {
Feature.UNICODE_LITERALS,
Expand All @@ -128,6 +130,7 @@ class Feature(Enum):
Feature.ASSIGNMENT_EXPRESSIONS,
Feature.RELAXED_DECORATORS,
Feature.POS_ONLY_ARGUMENTS,
Feature.UNPACKING_ON_FLOW,
},
TargetVersion.PY310: {
Feature.UNICODE_LITERALS,
Expand All @@ -140,6 +143,7 @@ class Feature(Enum):
Feature.ASSIGNMENT_EXPRESSIONS,
Feature.RELAXED_DECORATORS,
Feature.POS_ONLY_ARGUMENTS,
Feature.UNPACKING_ON_FLOW,
Feature.PATTERN_MATCHING,
},
}
Expand Down
8 changes: 8 additions & 0 deletions tests/test_black.py
Expand Up @@ -810,6 +810,14 @@ def test_get_features_used(self) -> None:
self.assertEqual(black.get_features_used(node), {Feature.POS_ONLY_ARGUMENTS})
node = black.lib2to3_parse("def fn(a, /, b): ...")
self.assertEqual(black.get_features_used(node), {Feature.POS_ONLY_ARGUMENTS})
node = black.lib2to3_parse("def fn(): yield a, b")
self.assertEqual(black.get_features_used(node), set())
node = black.lib2to3_parse("def fn(): return a, b")
self.assertEqual(black.get_features_used(node), set())
node = black.lib2to3_parse("def fn(): yield *b, c")
self.assertEqual(black.get_features_used(node), {Feature.UNPACKING_ON_FLOW})
node = black.lib2to3_parse("def fn(): return a, *b, c")
self.assertEqual(black.get_features_used(node), {Feature.UNPACKING_ON_FLOW})

def test_get_features_used_for_future_flags(self) -> None:
for src, features in [
Expand Down

0 comments on commit 2de9726

Please sign in to comment.