Unpacking on flow constructs (return/yield) now implies 3.8+ (#2700)
This commit is contained in:
parent
f10ce0c942
commit
dc90d4951f
@ -11,6 +11,7 @@
|
|||||||
(#2686)
|
(#2686)
|
||||||
- No longer color diff headers white as it's unreadable in light themed terminals
|
- No longer color diff headers white as it's unreadable in light themed terminals
|
||||||
(#2691)
|
(#2691)
|
||||||
|
- Tuple unpacking on `return` and `yield` constructs now implies 3.8+ (#2700)
|
||||||
|
|
||||||
## 21.12b0
|
## 21.12b0
|
||||||
|
|
||||||
|
@ -1210,6 +1210,14 @@ def get_features_used( # noqa: C901
|
|||||||
if argch.type in STARS:
|
if argch.type in STARS:
|
||||||
features.add(feature)
|
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
|
# Python 2 only features (for its deprecation) except for integers, see above
|
||||||
elif n.type == syms.print_stmt:
|
elif n.type == syms.print_stmt:
|
||||||
features.add(Feature.PRINT_STMT)
|
features.add(Feature.PRINT_STMT)
|
||||||
|
@ -49,6 +49,7 @@ class Feature(Enum):
|
|||||||
POS_ONLY_ARGUMENTS = 9
|
POS_ONLY_ARGUMENTS = 9
|
||||||
RELAXED_DECORATORS = 10
|
RELAXED_DECORATORS = 10
|
||||||
PATTERN_MATCHING = 11
|
PATTERN_MATCHING = 11
|
||||||
|
UNPACKING_ON_FLOW = 12
|
||||||
FORCE_OPTIONAL_PARENTHESES = 50
|
FORCE_OPTIONAL_PARENTHESES = 50
|
||||||
|
|
||||||
# __future__ flags
|
# __future__ flags
|
||||||
@ -116,6 +117,7 @@ class Feature(Enum):
|
|||||||
Feature.FUTURE_ANNOTATIONS,
|
Feature.FUTURE_ANNOTATIONS,
|
||||||
Feature.ASSIGNMENT_EXPRESSIONS,
|
Feature.ASSIGNMENT_EXPRESSIONS,
|
||||||
Feature.POS_ONLY_ARGUMENTS,
|
Feature.POS_ONLY_ARGUMENTS,
|
||||||
|
Feature.UNPACKING_ON_FLOW,
|
||||||
},
|
},
|
||||||
TargetVersion.PY39: {
|
TargetVersion.PY39: {
|
||||||
Feature.UNICODE_LITERALS,
|
Feature.UNICODE_LITERALS,
|
||||||
@ -128,6 +130,7 @@ class Feature(Enum):
|
|||||||
Feature.ASSIGNMENT_EXPRESSIONS,
|
Feature.ASSIGNMENT_EXPRESSIONS,
|
||||||
Feature.RELAXED_DECORATORS,
|
Feature.RELAXED_DECORATORS,
|
||||||
Feature.POS_ONLY_ARGUMENTS,
|
Feature.POS_ONLY_ARGUMENTS,
|
||||||
|
Feature.UNPACKING_ON_FLOW,
|
||||||
},
|
},
|
||||||
TargetVersion.PY310: {
|
TargetVersion.PY310: {
|
||||||
Feature.UNICODE_LITERALS,
|
Feature.UNICODE_LITERALS,
|
||||||
@ -140,6 +143,7 @@ class Feature(Enum):
|
|||||||
Feature.ASSIGNMENT_EXPRESSIONS,
|
Feature.ASSIGNMENT_EXPRESSIONS,
|
||||||
Feature.RELAXED_DECORATORS,
|
Feature.RELAXED_DECORATORS,
|
||||||
Feature.POS_ONLY_ARGUMENTS,
|
Feature.POS_ONLY_ARGUMENTS,
|
||||||
|
Feature.UNPACKING_ON_FLOW,
|
||||||
Feature.PATTERN_MATCHING,
|
Feature.PATTERN_MATCHING,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
@ -810,6 +810,14 @@ def test_get_features_used(self) -> None:
|
|||||||
self.assertEqual(black.get_features_used(node), {Feature.POS_ONLY_ARGUMENTS})
|
self.assertEqual(black.get_features_used(node), {Feature.POS_ONLY_ARGUMENTS})
|
||||||
node = black.lib2to3_parse("def fn(a, /, b): ...")
|
node = black.lib2to3_parse("def fn(a, /, b): ...")
|
||||||
self.assertEqual(black.get_features_used(node), {Feature.POS_ONLY_ARGUMENTS})
|
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:
|
def test_get_features_used_for_future_flags(self) -> None:
|
||||||
for src, features in [
|
for src, features in [
|
||||||
|
Loading…
Reference in New Issue
Block a user