Unpacking on flow constructs (return/yield) now implies 3.8+ (#2700)

This commit is contained in:
Batuhan Taskaya 2021-12-16 03:17:33 +03:00 committed by GitHub
parent f10ce0c942
commit dc90d4951f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 21 additions and 0 deletions

View File

@ -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

View File

@ -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)

View File

@ -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
@ -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,
@ -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,
@ -140,6 +143,7 @@ class Feature(Enum):
Feature.ASSIGNMENT_EXPRESSIONS,
Feature.RELAXED_DECORATORS,
Feature.POS_ONLY_ARGUMENTS,
Feature.UNPACKING_ON_FLOW,
Feature.PATTERN_MATCHING,
},
}

View File

@ -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 [