mirror of
https://github.com/astral-sh/ruff.git
synced 2025-08-02 09:52:32 +00:00
[syntax-errors] Tuple unpacking in return
and yield
before Python 3.8 (#16485)
Summary -- Checks for tuple unpacking in `return` and `yield` statements before Python 3.8, as described [here]. Test Plan -- Inline tests. [here]: https://github.com/python/cpython/issues/76298
This commit is contained in:
parent
0a627ef216
commit
6c14225c66
15 changed files with 1217 additions and 8 deletions
|
@ -0,0 +1,3 @@
|
||||||
|
# parse_options: {"target-version": "3.7"}
|
||||||
|
rest = (4, 5, 6)
|
||||||
|
def f(): return 1, 2, 3, *rest
|
|
@ -0,0 +1,4 @@
|
||||||
|
# parse_options: {"target-version": "3.7"}
|
||||||
|
rest = (4, 5, 6)
|
||||||
|
def g(): yield 1, 2, 3, *rest
|
||||||
|
def h(): yield 1, (yield 2, *rest), 3
|
|
@ -0,0 +1,3 @@
|
||||||
|
# parse_options: {"target-version": "3.7"}
|
||||||
|
rest = (4, 5, 6)
|
||||||
|
def f(): return (1, 2, 3, *rest)
|
|
@ -0,0 +1,3 @@
|
||||||
|
# parse_options: {"target-version": "3.8"}
|
||||||
|
rest = (4, 5, 6)
|
||||||
|
def f(): return 1, 2, 3, *rest
|
|
@ -0,0 +1,3 @@
|
||||||
|
# parse_options: {"target-version": "3.7"}
|
||||||
|
rest = (4, 5, 6)
|
||||||
|
def g(): yield (1, 2, 3, *rest)
|
|
@ -0,0 +1,4 @@
|
||||||
|
# parse_options: {"target-version": "3.8"}
|
||||||
|
rest = (4, 5, 6)
|
||||||
|
def g(): yield 1, 2, 3, *rest
|
||||||
|
def h(): yield 1, (yield 2, *rest), 3
|
|
@ -444,11 +444,68 @@ pub struct UnsupportedSyntaxError {
|
||||||
pub target_version: PythonVersion,
|
pub target_version: PythonVersion,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// The type of tuple unpacking for [`UnsupportedSyntaxErrorKind::StarTuple`].
|
||||||
|
#[derive(Debug, PartialEq, Clone, Copy)]
|
||||||
|
pub enum StarTupleKind {
|
||||||
|
Return,
|
||||||
|
Yield,
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Debug, PartialEq, Clone, Copy)]
|
#[derive(Debug, PartialEq, Clone, Copy)]
|
||||||
pub enum UnsupportedSyntaxErrorKind {
|
pub enum UnsupportedSyntaxErrorKind {
|
||||||
Match,
|
Match,
|
||||||
Walrus,
|
Walrus,
|
||||||
ExceptStar,
|
ExceptStar,
|
||||||
|
|
||||||
|
/// Represents the use of unparenthesized tuple unpacking in a `return` statement or `yield`
|
||||||
|
/// expression before Python 3.8.
|
||||||
|
///
|
||||||
|
/// ## Examples
|
||||||
|
///
|
||||||
|
/// Before Python 3.8, this syntax was allowed:
|
||||||
|
///
|
||||||
|
/// ```python
|
||||||
|
/// rest = (4, 5, 6)
|
||||||
|
///
|
||||||
|
/// def f():
|
||||||
|
/// t = 1, 2, 3, *rest
|
||||||
|
/// return t
|
||||||
|
///
|
||||||
|
/// def g():
|
||||||
|
/// t = 1, 2, 3, *rest
|
||||||
|
/// yield t
|
||||||
|
/// ```
|
||||||
|
///
|
||||||
|
/// But this was not:
|
||||||
|
///
|
||||||
|
/// ```python
|
||||||
|
/// rest = (4, 5, 6)
|
||||||
|
///
|
||||||
|
/// def f():
|
||||||
|
/// return 1, 2, 3, *rest
|
||||||
|
///
|
||||||
|
/// def g():
|
||||||
|
/// yield 1, 2, 3, *rest
|
||||||
|
/// ```
|
||||||
|
///
|
||||||
|
/// Instead, parentheses were required in the `return` and `yield` cases:
|
||||||
|
///
|
||||||
|
/// ```python
|
||||||
|
/// rest = (4, 5, 6)
|
||||||
|
///
|
||||||
|
/// def f():
|
||||||
|
/// return (1, 2, 3, *rest)
|
||||||
|
///
|
||||||
|
/// def g():
|
||||||
|
/// yield (1, 2, 3, *rest)
|
||||||
|
/// ```
|
||||||
|
///
|
||||||
|
/// This was reported in [BPO 32117] and updated in Python 3.8 to allow the unparenthesized
|
||||||
|
/// form.
|
||||||
|
///
|
||||||
|
/// [BPO 32117]: https://github.com/python/cpython/issues/76298
|
||||||
|
StarTuple(StarTupleKind),
|
||||||
|
|
||||||
/// Represents the use of a "relaxed" [PEP 614] decorator before Python 3.9.
|
/// Represents the use of a "relaxed" [PEP 614] decorator before Python 3.9.
|
||||||
///
|
///
|
||||||
/// ## Examples
|
/// ## Examples
|
||||||
|
@ -480,6 +537,7 @@ pub enum UnsupportedSyntaxErrorKind {
|
||||||
/// [`dotted_name`]: https://docs.python.org/3.8/reference/compound_stmts.html#grammar-token-dotted-name
|
/// [`dotted_name`]: https://docs.python.org/3.8/reference/compound_stmts.html#grammar-token-dotted-name
|
||||||
/// [decorator grammar]: https://docs.python.org/3/reference/compound_stmts.html#grammar-token-python-grammar-decorator
|
/// [decorator grammar]: https://docs.python.org/3/reference/compound_stmts.html#grammar-token-python-grammar-decorator
|
||||||
RelaxedDecorator,
|
RelaxedDecorator,
|
||||||
|
|
||||||
/// Represents the use of a [PEP 570] positional-only parameter before Python 3.8.
|
/// Represents the use of a [PEP 570] positional-only parameter before Python 3.8.
|
||||||
///
|
///
|
||||||
/// ## Examples
|
/// ## Examples
|
||||||
|
@ -506,6 +564,7 @@ pub enum UnsupportedSyntaxErrorKind {
|
||||||
///
|
///
|
||||||
/// [PEP 570]: https://peps.python.org/pep-0570/
|
/// [PEP 570]: https://peps.python.org/pep-0570/
|
||||||
PositionalOnlyParameter,
|
PositionalOnlyParameter,
|
||||||
|
|
||||||
/// Represents the use of a [type parameter list] before Python 3.12.
|
/// Represents the use of a [type parameter list] before Python 3.12.
|
||||||
///
|
///
|
||||||
/// ## Examples
|
/// ## Examples
|
||||||
|
@ -544,6 +603,12 @@ impl Display for UnsupportedSyntaxError {
|
||||||
UnsupportedSyntaxErrorKind::Match => "Cannot use `match` statement",
|
UnsupportedSyntaxErrorKind::Match => "Cannot use `match` statement",
|
||||||
UnsupportedSyntaxErrorKind::Walrus => "Cannot use named assignment expression (`:=`)",
|
UnsupportedSyntaxErrorKind::Walrus => "Cannot use named assignment expression (`:=`)",
|
||||||
UnsupportedSyntaxErrorKind::ExceptStar => "Cannot use `except*`",
|
UnsupportedSyntaxErrorKind::ExceptStar => "Cannot use `except*`",
|
||||||
|
UnsupportedSyntaxErrorKind::StarTuple(StarTupleKind::Return) => {
|
||||||
|
"Cannot use iterable unpacking in return statements"
|
||||||
|
}
|
||||||
|
UnsupportedSyntaxErrorKind::StarTuple(StarTupleKind::Yield) => {
|
||||||
|
"Cannot use iterable unpacking in yield expressions"
|
||||||
|
}
|
||||||
UnsupportedSyntaxErrorKind::RelaxedDecorator => "Unsupported expression in decorators",
|
UnsupportedSyntaxErrorKind::RelaxedDecorator => "Unsupported expression in decorators",
|
||||||
UnsupportedSyntaxErrorKind::PositionalOnlyParameter => {
|
UnsupportedSyntaxErrorKind::PositionalOnlyParameter => {
|
||||||
"Cannot use positional-only parameter separator"
|
"Cannot use positional-only parameter separator"
|
||||||
|
@ -570,6 +635,7 @@ impl UnsupportedSyntaxErrorKind {
|
||||||
UnsupportedSyntaxErrorKind::Match => PythonVersion::PY310,
|
UnsupportedSyntaxErrorKind::Match => PythonVersion::PY310,
|
||||||
UnsupportedSyntaxErrorKind::Walrus => PythonVersion::PY38,
|
UnsupportedSyntaxErrorKind::Walrus => PythonVersion::PY38,
|
||||||
UnsupportedSyntaxErrorKind::ExceptStar => PythonVersion::PY311,
|
UnsupportedSyntaxErrorKind::ExceptStar => PythonVersion::PY311,
|
||||||
|
UnsupportedSyntaxErrorKind::StarTuple(_) => PythonVersion::PY38,
|
||||||
UnsupportedSyntaxErrorKind::RelaxedDecorator => PythonVersion::PY39,
|
UnsupportedSyntaxErrorKind::RelaxedDecorator => PythonVersion::PY39,
|
||||||
UnsupportedSyntaxErrorKind::PositionalOnlyParameter => PythonVersion::PY38,
|
UnsupportedSyntaxErrorKind::PositionalOnlyParameter => PythonVersion::PY38,
|
||||||
UnsupportedSyntaxErrorKind::TypeParameterList => PythonVersion::PY312,
|
UnsupportedSyntaxErrorKind::TypeParameterList => PythonVersion::PY312,
|
||||||
|
|
|
@ -11,6 +11,7 @@ use ruff_python_ast::{
|
||||||
};
|
};
|
||||||
use ruff_text_size::{Ranged, TextLen, TextRange, TextSize};
|
use ruff_text_size::{Ranged, TextLen, TextRange, TextSize};
|
||||||
|
|
||||||
|
use crate::error::StarTupleKind;
|
||||||
use crate::parser::progress::ParserProgress;
|
use crate::parser::progress::ParserProgress;
|
||||||
use crate::parser::{helpers, FunctionKind, Parser};
|
use crate::parser::{helpers, FunctionKind, Parser};
|
||||||
use crate::string::{parse_fstring_literal_element, parse_string_literal, StringType};
|
use crate::string::{parse_fstring_literal_element, parse_string_literal, StringType};
|
||||||
|
@ -2089,10 +2090,27 @@ impl<'src> Parser<'src> {
|
||||||
}
|
}
|
||||||
|
|
||||||
let value = self.at_expr().then(|| {
|
let value = self.at_expr().then(|| {
|
||||||
Box::new(
|
let parsed_expr = self.parse_expression_list(ExpressionContext::starred_bitwise_or());
|
||||||
self.parse_expression_list(ExpressionContext::starred_bitwise_or())
|
|
||||||
.expr,
|
// test_ok iter_unpack_yield_py37
|
||||||
)
|
// # parse_options: {"target-version": "3.7"}
|
||||||
|
// rest = (4, 5, 6)
|
||||||
|
// def g(): yield (1, 2, 3, *rest)
|
||||||
|
|
||||||
|
// test_ok iter_unpack_yield_py38
|
||||||
|
// # parse_options: {"target-version": "3.8"}
|
||||||
|
// rest = (4, 5, 6)
|
||||||
|
// def g(): yield 1, 2, 3, *rest
|
||||||
|
// def h(): yield 1, (yield 2, *rest), 3
|
||||||
|
|
||||||
|
// test_err iter_unpack_yield_py37
|
||||||
|
// # parse_options: {"target-version": "3.7"}
|
||||||
|
// rest = (4, 5, 6)
|
||||||
|
// def g(): yield 1, 2, 3, *rest
|
||||||
|
// def h(): yield 1, (yield 2, *rest), 3
|
||||||
|
self.check_tuple_unpacking(&parsed_expr, StarTupleKind::Yield);
|
||||||
|
|
||||||
|
Box::new(parsed_expr.expr)
|
||||||
});
|
});
|
||||||
|
|
||||||
Expr::Yield(ast::ExprYield {
|
Expr::Yield(ast::ExprYield {
|
||||||
|
|
|
@ -10,6 +10,7 @@ use ruff_python_ast::{
|
||||||
};
|
};
|
||||||
use ruff_text_size::{Ranged, TextRange, TextSize};
|
use ruff_text_size::{Ranged, TextRange, TextSize};
|
||||||
|
|
||||||
|
use crate::error::StarTupleKind;
|
||||||
use crate::parser::expression::{ParsedExpr, EXPR_SET};
|
use crate::parser::expression::{ParsedExpr, EXPR_SET};
|
||||||
use crate::parser::progress::ParserProgress;
|
use crate::parser::progress::ParserProgress;
|
||||||
use crate::parser::{
|
use crate::parser::{
|
||||||
|
@ -389,10 +390,25 @@ impl<'src> Parser<'src> {
|
||||||
// return x := 1
|
// return x := 1
|
||||||
// return *x and y
|
// return *x and y
|
||||||
let value = self.at_expr().then(|| {
|
let value = self.at_expr().then(|| {
|
||||||
Box::new(
|
let parsed_expr = self.parse_expression_list(ExpressionContext::starred_bitwise_or());
|
||||||
self.parse_expression_list(ExpressionContext::starred_bitwise_or())
|
|
||||||
.expr,
|
// test_ok iter_unpack_return_py37
|
||||||
)
|
// # parse_options: {"target-version": "3.7"}
|
||||||
|
// rest = (4, 5, 6)
|
||||||
|
// def f(): return (1, 2, 3, *rest)
|
||||||
|
|
||||||
|
// test_ok iter_unpack_return_py38
|
||||||
|
// # parse_options: {"target-version": "3.8"}
|
||||||
|
// rest = (4, 5, 6)
|
||||||
|
// def f(): return 1, 2, 3, *rest
|
||||||
|
|
||||||
|
// test_err iter_unpack_return_py37
|
||||||
|
// # parse_options: {"target-version": "3.7"}
|
||||||
|
// rest = (4, 5, 6)
|
||||||
|
// def f(): return 1, 2, 3, *rest
|
||||||
|
self.check_tuple_unpacking(&parsed_expr, StarTupleKind::Return);
|
||||||
|
|
||||||
|
Box::new(parsed_expr.expr)
|
||||||
});
|
});
|
||||||
|
|
||||||
ast::StmtReturn {
|
ast::StmtReturn {
|
||||||
|
@ -401,6 +417,33 @@ impl<'src> Parser<'src> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Report [`UnsupportedSyntaxError`]s for each starred element in `expr` if it is an
|
||||||
|
/// unparenthesized tuple.
|
||||||
|
///
|
||||||
|
/// This method can be used to check for tuple unpacking in return and yield statements, which
|
||||||
|
/// are only allowed in Python 3.8 and later: <https://github.com/python/cpython/issues/76298>.
|
||||||
|
pub(crate) fn check_tuple_unpacking(&mut self, expr: &Expr, kind: StarTupleKind) {
|
||||||
|
let kind = UnsupportedSyntaxErrorKind::StarTuple(kind);
|
||||||
|
if self.options.target_version >= kind.minimum_version() {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
let Expr::Tuple(ast::ExprTuple {
|
||||||
|
elts,
|
||||||
|
parenthesized: false,
|
||||||
|
..
|
||||||
|
}) = expr
|
||||||
|
else {
|
||||||
|
return;
|
||||||
|
};
|
||||||
|
|
||||||
|
for elt in elts {
|
||||||
|
if elt.is_starred_expr() {
|
||||||
|
self.add_unsupported_syntax_error(kind, elt.range());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Parses a `raise` statement.
|
/// Parses a `raise` statement.
|
||||||
///
|
///
|
||||||
/// # Panics
|
/// # Panics
|
||||||
|
|
|
@ -0,0 +1,146 @@
|
||||||
|
---
|
||||||
|
source: crates/ruff_python_parser/tests/fixtures.rs
|
||||||
|
input_file: crates/ruff_python_parser/resources/inline/err/iter_unpack_return_py37.py
|
||||||
|
---
|
||||||
|
## AST
|
||||||
|
|
||||||
|
```
|
||||||
|
Module(
|
||||||
|
ModModule {
|
||||||
|
range: 0..91,
|
||||||
|
body: [
|
||||||
|
Assign(
|
||||||
|
StmtAssign {
|
||||||
|
range: 43..59,
|
||||||
|
targets: [
|
||||||
|
Name(
|
||||||
|
ExprName {
|
||||||
|
range: 43..47,
|
||||||
|
id: Name("rest"),
|
||||||
|
ctx: Store,
|
||||||
|
},
|
||||||
|
),
|
||||||
|
],
|
||||||
|
value: Tuple(
|
||||||
|
ExprTuple {
|
||||||
|
range: 50..59,
|
||||||
|
elts: [
|
||||||
|
NumberLiteral(
|
||||||
|
ExprNumberLiteral {
|
||||||
|
range: 51..52,
|
||||||
|
value: Int(
|
||||||
|
4,
|
||||||
|
),
|
||||||
|
},
|
||||||
|
),
|
||||||
|
NumberLiteral(
|
||||||
|
ExprNumberLiteral {
|
||||||
|
range: 54..55,
|
||||||
|
value: Int(
|
||||||
|
5,
|
||||||
|
),
|
||||||
|
},
|
||||||
|
),
|
||||||
|
NumberLiteral(
|
||||||
|
ExprNumberLiteral {
|
||||||
|
range: 57..58,
|
||||||
|
value: Int(
|
||||||
|
6,
|
||||||
|
),
|
||||||
|
},
|
||||||
|
),
|
||||||
|
],
|
||||||
|
ctx: Load,
|
||||||
|
parenthesized: true,
|
||||||
|
},
|
||||||
|
),
|
||||||
|
},
|
||||||
|
),
|
||||||
|
FunctionDef(
|
||||||
|
StmtFunctionDef {
|
||||||
|
range: 60..90,
|
||||||
|
is_async: false,
|
||||||
|
decorator_list: [],
|
||||||
|
name: Identifier {
|
||||||
|
id: Name("f"),
|
||||||
|
range: 64..65,
|
||||||
|
},
|
||||||
|
type_params: None,
|
||||||
|
parameters: Parameters {
|
||||||
|
range: 65..67,
|
||||||
|
posonlyargs: [],
|
||||||
|
args: [],
|
||||||
|
vararg: None,
|
||||||
|
kwonlyargs: [],
|
||||||
|
kwarg: None,
|
||||||
|
},
|
||||||
|
returns: None,
|
||||||
|
body: [
|
||||||
|
Return(
|
||||||
|
StmtReturn {
|
||||||
|
range: 69..90,
|
||||||
|
value: Some(
|
||||||
|
Tuple(
|
||||||
|
ExprTuple {
|
||||||
|
range: 76..90,
|
||||||
|
elts: [
|
||||||
|
NumberLiteral(
|
||||||
|
ExprNumberLiteral {
|
||||||
|
range: 76..77,
|
||||||
|
value: Int(
|
||||||
|
1,
|
||||||
|
),
|
||||||
|
},
|
||||||
|
),
|
||||||
|
NumberLiteral(
|
||||||
|
ExprNumberLiteral {
|
||||||
|
range: 79..80,
|
||||||
|
value: Int(
|
||||||
|
2,
|
||||||
|
),
|
||||||
|
},
|
||||||
|
),
|
||||||
|
NumberLiteral(
|
||||||
|
ExprNumberLiteral {
|
||||||
|
range: 82..83,
|
||||||
|
value: Int(
|
||||||
|
3,
|
||||||
|
),
|
||||||
|
},
|
||||||
|
),
|
||||||
|
Starred(
|
||||||
|
ExprStarred {
|
||||||
|
range: 85..90,
|
||||||
|
value: Name(
|
||||||
|
ExprName {
|
||||||
|
range: 86..90,
|
||||||
|
id: Name("rest"),
|
||||||
|
ctx: Load,
|
||||||
|
},
|
||||||
|
),
|
||||||
|
ctx: Load,
|
||||||
|
},
|
||||||
|
),
|
||||||
|
],
|
||||||
|
ctx: Load,
|
||||||
|
parenthesized: false,
|
||||||
|
},
|
||||||
|
),
|
||||||
|
),
|
||||||
|
},
|
||||||
|
),
|
||||||
|
],
|
||||||
|
},
|
||||||
|
),
|
||||||
|
],
|
||||||
|
},
|
||||||
|
)
|
||||||
|
```
|
||||||
|
## Unsupported Syntax Errors
|
||||||
|
|
||||||
|
|
|
||||||
|
1 | # parse_options: {"target-version": "3.7"}
|
||||||
|
2 | rest = (4, 5, 6)
|
||||||
|
3 | def f(): return 1, 2, 3, *rest
|
||||||
|
| ^^^^^ Syntax Error: Cannot use iterable unpacking in return statements on Python 3.7 (syntax was added in Python 3.8)
|
||||||
|
|
|
|
@ -0,0 +1,257 @@
|
||||||
|
---
|
||||||
|
source: crates/ruff_python_parser/tests/fixtures.rs
|
||||||
|
input_file: crates/ruff_python_parser/resources/inline/err/iter_unpack_yield_py37.py
|
||||||
|
---
|
||||||
|
## AST
|
||||||
|
|
||||||
|
```
|
||||||
|
Module(
|
||||||
|
ModModule {
|
||||||
|
range: 0..128,
|
||||||
|
body: [
|
||||||
|
Assign(
|
||||||
|
StmtAssign {
|
||||||
|
range: 43..59,
|
||||||
|
targets: [
|
||||||
|
Name(
|
||||||
|
ExprName {
|
||||||
|
range: 43..47,
|
||||||
|
id: Name("rest"),
|
||||||
|
ctx: Store,
|
||||||
|
},
|
||||||
|
),
|
||||||
|
],
|
||||||
|
value: Tuple(
|
||||||
|
ExprTuple {
|
||||||
|
range: 50..59,
|
||||||
|
elts: [
|
||||||
|
NumberLiteral(
|
||||||
|
ExprNumberLiteral {
|
||||||
|
range: 51..52,
|
||||||
|
value: Int(
|
||||||
|
4,
|
||||||
|
),
|
||||||
|
},
|
||||||
|
),
|
||||||
|
NumberLiteral(
|
||||||
|
ExprNumberLiteral {
|
||||||
|
range: 54..55,
|
||||||
|
value: Int(
|
||||||
|
5,
|
||||||
|
),
|
||||||
|
},
|
||||||
|
),
|
||||||
|
NumberLiteral(
|
||||||
|
ExprNumberLiteral {
|
||||||
|
range: 57..58,
|
||||||
|
value: Int(
|
||||||
|
6,
|
||||||
|
),
|
||||||
|
},
|
||||||
|
),
|
||||||
|
],
|
||||||
|
ctx: Load,
|
||||||
|
parenthesized: true,
|
||||||
|
},
|
||||||
|
),
|
||||||
|
},
|
||||||
|
),
|
||||||
|
FunctionDef(
|
||||||
|
StmtFunctionDef {
|
||||||
|
range: 60..89,
|
||||||
|
is_async: false,
|
||||||
|
decorator_list: [],
|
||||||
|
name: Identifier {
|
||||||
|
id: Name("g"),
|
||||||
|
range: 64..65,
|
||||||
|
},
|
||||||
|
type_params: None,
|
||||||
|
parameters: Parameters {
|
||||||
|
range: 65..67,
|
||||||
|
posonlyargs: [],
|
||||||
|
args: [],
|
||||||
|
vararg: None,
|
||||||
|
kwonlyargs: [],
|
||||||
|
kwarg: None,
|
||||||
|
},
|
||||||
|
returns: None,
|
||||||
|
body: [
|
||||||
|
Expr(
|
||||||
|
StmtExpr {
|
||||||
|
range: 69..89,
|
||||||
|
value: Yield(
|
||||||
|
ExprYield {
|
||||||
|
range: 69..89,
|
||||||
|
value: Some(
|
||||||
|
Tuple(
|
||||||
|
ExprTuple {
|
||||||
|
range: 75..89,
|
||||||
|
elts: [
|
||||||
|
NumberLiteral(
|
||||||
|
ExprNumberLiteral {
|
||||||
|
range: 75..76,
|
||||||
|
value: Int(
|
||||||
|
1,
|
||||||
|
),
|
||||||
|
},
|
||||||
|
),
|
||||||
|
NumberLiteral(
|
||||||
|
ExprNumberLiteral {
|
||||||
|
range: 78..79,
|
||||||
|
value: Int(
|
||||||
|
2,
|
||||||
|
),
|
||||||
|
},
|
||||||
|
),
|
||||||
|
NumberLiteral(
|
||||||
|
ExprNumberLiteral {
|
||||||
|
range: 81..82,
|
||||||
|
value: Int(
|
||||||
|
3,
|
||||||
|
),
|
||||||
|
},
|
||||||
|
),
|
||||||
|
Starred(
|
||||||
|
ExprStarred {
|
||||||
|
range: 84..89,
|
||||||
|
value: Name(
|
||||||
|
ExprName {
|
||||||
|
range: 85..89,
|
||||||
|
id: Name("rest"),
|
||||||
|
ctx: Load,
|
||||||
|
},
|
||||||
|
),
|
||||||
|
ctx: Load,
|
||||||
|
},
|
||||||
|
),
|
||||||
|
],
|
||||||
|
ctx: Load,
|
||||||
|
parenthesized: false,
|
||||||
|
},
|
||||||
|
),
|
||||||
|
),
|
||||||
|
},
|
||||||
|
),
|
||||||
|
},
|
||||||
|
),
|
||||||
|
],
|
||||||
|
},
|
||||||
|
),
|
||||||
|
FunctionDef(
|
||||||
|
StmtFunctionDef {
|
||||||
|
range: 90..127,
|
||||||
|
is_async: false,
|
||||||
|
decorator_list: [],
|
||||||
|
name: Identifier {
|
||||||
|
id: Name("h"),
|
||||||
|
range: 94..95,
|
||||||
|
},
|
||||||
|
type_params: None,
|
||||||
|
parameters: Parameters {
|
||||||
|
range: 95..97,
|
||||||
|
posonlyargs: [],
|
||||||
|
args: [],
|
||||||
|
vararg: None,
|
||||||
|
kwonlyargs: [],
|
||||||
|
kwarg: None,
|
||||||
|
},
|
||||||
|
returns: None,
|
||||||
|
body: [
|
||||||
|
Expr(
|
||||||
|
StmtExpr {
|
||||||
|
range: 99..127,
|
||||||
|
value: Yield(
|
||||||
|
ExprYield {
|
||||||
|
range: 99..127,
|
||||||
|
value: Some(
|
||||||
|
Tuple(
|
||||||
|
ExprTuple {
|
||||||
|
range: 105..127,
|
||||||
|
elts: [
|
||||||
|
NumberLiteral(
|
||||||
|
ExprNumberLiteral {
|
||||||
|
range: 105..106,
|
||||||
|
value: Int(
|
||||||
|
1,
|
||||||
|
),
|
||||||
|
},
|
||||||
|
),
|
||||||
|
Yield(
|
||||||
|
ExprYield {
|
||||||
|
range: 109..123,
|
||||||
|
value: Some(
|
||||||
|
Tuple(
|
||||||
|
ExprTuple {
|
||||||
|
range: 115..123,
|
||||||
|
elts: [
|
||||||
|
NumberLiteral(
|
||||||
|
ExprNumberLiteral {
|
||||||
|
range: 115..116,
|
||||||
|
value: Int(
|
||||||
|
2,
|
||||||
|
),
|
||||||
|
},
|
||||||
|
),
|
||||||
|
Starred(
|
||||||
|
ExprStarred {
|
||||||
|
range: 118..123,
|
||||||
|
value: Name(
|
||||||
|
ExprName {
|
||||||
|
range: 119..123,
|
||||||
|
id: Name("rest"),
|
||||||
|
ctx: Load,
|
||||||
|
},
|
||||||
|
),
|
||||||
|
ctx: Load,
|
||||||
|
},
|
||||||
|
),
|
||||||
|
],
|
||||||
|
ctx: Load,
|
||||||
|
parenthesized: false,
|
||||||
|
},
|
||||||
|
),
|
||||||
|
),
|
||||||
|
},
|
||||||
|
),
|
||||||
|
NumberLiteral(
|
||||||
|
ExprNumberLiteral {
|
||||||
|
range: 126..127,
|
||||||
|
value: Int(
|
||||||
|
3,
|
||||||
|
),
|
||||||
|
},
|
||||||
|
),
|
||||||
|
],
|
||||||
|
ctx: Load,
|
||||||
|
parenthesized: false,
|
||||||
|
},
|
||||||
|
),
|
||||||
|
),
|
||||||
|
},
|
||||||
|
),
|
||||||
|
},
|
||||||
|
),
|
||||||
|
],
|
||||||
|
},
|
||||||
|
),
|
||||||
|
],
|
||||||
|
},
|
||||||
|
)
|
||||||
|
```
|
||||||
|
## Unsupported Syntax Errors
|
||||||
|
|
||||||
|
|
|
||||||
|
1 | # parse_options: {"target-version": "3.7"}
|
||||||
|
2 | rest = (4, 5, 6)
|
||||||
|
3 | def g(): yield 1, 2, 3, *rest
|
||||||
|
| ^^^^^ Syntax Error: Cannot use iterable unpacking in yield expressions on Python 3.7 (syntax was added in Python 3.8)
|
||||||
|
4 | def h(): yield 1, (yield 2, *rest), 3
|
||||||
|
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
2 | rest = (4, 5, 6)
|
||||||
|
3 | def g(): yield 1, 2, 3, *rest
|
||||||
|
4 | def h(): yield 1, (yield 2, *rest), 3
|
||||||
|
| ^^^^^ Syntax Error: Cannot use iterable unpacking in yield expressions on Python 3.7 (syntax was added in Python 3.8)
|
||||||
|
|
|
|
@ -0,0 +1,138 @@
|
||||||
|
---
|
||||||
|
source: crates/ruff_python_parser/tests/fixtures.rs
|
||||||
|
input_file: crates/ruff_python_parser/resources/inline/ok/iter_unpack_return_py37.py
|
||||||
|
---
|
||||||
|
## AST
|
||||||
|
|
||||||
|
```
|
||||||
|
Module(
|
||||||
|
ModModule {
|
||||||
|
range: 0..93,
|
||||||
|
body: [
|
||||||
|
Assign(
|
||||||
|
StmtAssign {
|
||||||
|
range: 43..59,
|
||||||
|
targets: [
|
||||||
|
Name(
|
||||||
|
ExprName {
|
||||||
|
range: 43..47,
|
||||||
|
id: Name("rest"),
|
||||||
|
ctx: Store,
|
||||||
|
},
|
||||||
|
),
|
||||||
|
],
|
||||||
|
value: Tuple(
|
||||||
|
ExprTuple {
|
||||||
|
range: 50..59,
|
||||||
|
elts: [
|
||||||
|
NumberLiteral(
|
||||||
|
ExprNumberLiteral {
|
||||||
|
range: 51..52,
|
||||||
|
value: Int(
|
||||||
|
4,
|
||||||
|
),
|
||||||
|
},
|
||||||
|
),
|
||||||
|
NumberLiteral(
|
||||||
|
ExprNumberLiteral {
|
||||||
|
range: 54..55,
|
||||||
|
value: Int(
|
||||||
|
5,
|
||||||
|
),
|
||||||
|
},
|
||||||
|
),
|
||||||
|
NumberLiteral(
|
||||||
|
ExprNumberLiteral {
|
||||||
|
range: 57..58,
|
||||||
|
value: Int(
|
||||||
|
6,
|
||||||
|
),
|
||||||
|
},
|
||||||
|
),
|
||||||
|
],
|
||||||
|
ctx: Load,
|
||||||
|
parenthesized: true,
|
||||||
|
},
|
||||||
|
),
|
||||||
|
},
|
||||||
|
),
|
||||||
|
FunctionDef(
|
||||||
|
StmtFunctionDef {
|
||||||
|
range: 60..92,
|
||||||
|
is_async: false,
|
||||||
|
decorator_list: [],
|
||||||
|
name: Identifier {
|
||||||
|
id: Name("f"),
|
||||||
|
range: 64..65,
|
||||||
|
},
|
||||||
|
type_params: None,
|
||||||
|
parameters: Parameters {
|
||||||
|
range: 65..67,
|
||||||
|
posonlyargs: [],
|
||||||
|
args: [],
|
||||||
|
vararg: None,
|
||||||
|
kwonlyargs: [],
|
||||||
|
kwarg: None,
|
||||||
|
},
|
||||||
|
returns: None,
|
||||||
|
body: [
|
||||||
|
Return(
|
||||||
|
StmtReturn {
|
||||||
|
range: 69..92,
|
||||||
|
value: Some(
|
||||||
|
Tuple(
|
||||||
|
ExprTuple {
|
||||||
|
range: 76..92,
|
||||||
|
elts: [
|
||||||
|
NumberLiteral(
|
||||||
|
ExprNumberLiteral {
|
||||||
|
range: 77..78,
|
||||||
|
value: Int(
|
||||||
|
1,
|
||||||
|
),
|
||||||
|
},
|
||||||
|
),
|
||||||
|
NumberLiteral(
|
||||||
|
ExprNumberLiteral {
|
||||||
|
range: 80..81,
|
||||||
|
value: Int(
|
||||||
|
2,
|
||||||
|
),
|
||||||
|
},
|
||||||
|
),
|
||||||
|
NumberLiteral(
|
||||||
|
ExprNumberLiteral {
|
||||||
|
range: 83..84,
|
||||||
|
value: Int(
|
||||||
|
3,
|
||||||
|
),
|
||||||
|
},
|
||||||
|
),
|
||||||
|
Starred(
|
||||||
|
ExprStarred {
|
||||||
|
range: 86..91,
|
||||||
|
value: Name(
|
||||||
|
ExprName {
|
||||||
|
range: 87..91,
|
||||||
|
id: Name("rest"),
|
||||||
|
ctx: Load,
|
||||||
|
},
|
||||||
|
),
|
||||||
|
ctx: Load,
|
||||||
|
},
|
||||||
|
),
|
||||||
|
],
|
||||||
|
ctx: Load,
|
||||||
|
parenthesized: true,
|
||||||
|
},
|
||||||
|
),
|
||||||
|
),
|
||||||
|
},
|
||||||
|
),
|
||||||
|
],
|
||||||
|
},
|
||||||
|
),
|
||||||
|
],
|
||||||
|
},
|
||||||
|
)
|
||||||
|
```
|
|
@ -0,0 +1,138 @@
|
||||||
|
---
|
||||||
|
source: crates/ruff_python_parser/tests/fixtures.rs
|
||||||
|
input_file: crates/ruff_python_parser/resources/inline/ok/iter_unpack_return_py38.py
|
||||||
|
---
|
||||||
|
## AST
|
||||||
|
|
||||||
|
```
|
||||||
|
Module(
|
||||||
|
ModModule {
|
||||||
|
range: 0..91,
|
||||||
|
body: [
|
||||||
|
Assign(
|
||||||
|
StmtAssign {
|
||||||
|
range: 43..59,
|
||||||
|
targets: [
|
||||||
|
Name(
|
||||||
|
ExprName {
|
||||||
|
range: 43..47,
|
||||||
|
id: Name("rest"),
|
||||||
|
ctx: Store,
|
||||||
|
},
|
||||||
|
),
|
||||||
|
],
|
||||||
|
value: Tuple(
|
||||||
|
ExprTuple {
|
||||||
|
range: 50..59,
|
||||||
|
elts: [
|
||||||
|
NumberLiteral(
|
||||||
|
ExprNumberLiteral {
|
||||||
|
range: 51..52,
|
||||||
|
value: Int(
|
||||||
|
4,
|
||||||
|
),
|
||||||
|
},
|
||||||
|
),
|
||||||
|
NumberLiteral(
|
||||||
|
ExprNumberLiteral {
|
||||||
|
range: 54..55,
|
||||||
|
value: Int(
|
||||||
|
5,
|
||||||
|
),
|
||||||
|
},
|
||||||
|
),
|
||||||
|
NumberLiteral(
|
||||||
|
ExprNumberLiteral {
|
||||||
|
range: 57..58,
|
||||||
|
value: Int(
|
||||||
|
6,
|
||||||
|
),
|
||||||
|
},
|
||||||
|
),
|
||||||
|
],
|
||||||
|
ctx: Load,
|
||||||
|
parenthesized: true,
|
||||||
|
},
|
||||||
|
),
|
||||||
|
},
|
||||||
|
),
|
||||||
|
FunctionDef(
|
||||||
|
StmtFunctionDef {
|
||||||
|
range: 60..90,
|
||||||
|
is_async: false,
|
||||||
|
decorator_list: [],
|
||||||
|
name: Identifier {
|
||||||
|
id: Name("f"),
|
||||||
|
range: 64..65,
|
||||||
|
},
|
||||||
|
type_params: None,
|
||||||
|
parameters: Parameters {
|
||||||
|
range: 65..67,
|
||||||
|
posonlyargs: [],
|
||||||
|
args: [],
|
||||||
|
vararg: None,
|
||||||
|
kwonlyargs: [],
|
||||||
|
kwarg: None,
|
||||||
|
},
|
||||||
|
returns: None,
|
||||||
|
body: [
|
||||||
|
Return(
|
||||||
|
StmtReturn {
|
||||||
|
range: 69..90,
|
||||||
|
value: Some(
|
||||||
|
Tuple(
|
||||||
|
ExprTuple {
|
||||||
|
range: 76..90,
|
||||||
|
elts: [
|
||||||
|
NumberLiteral(
|
||||||
|
ExprNumberLiteral {
|
||||||
|
range: 76..77,
|
||||||
|
value: Int(
|
||||||
|
1,
|
||||||
|
),
|
||||||
|
},
|
||||||
|
),
|
||||||
|
NumberLiteral(
|
||||||
|
ExprNumberLiteral {
|
||||||
|
range: 79..80,
|
||||||
|
value: Int(
|
||||||
|
2,
|
||||||
|
),
|
||||||
|
},
|
||||||
|
),
|
||||||
|
NumberLiteral(
|
||||||
|
ExprNumberLiteral {
|
||||||
|
range: 82..83,
|
||||||
|
value: Int(
|
||||||
|
3,
|
||||||
|
),
|
||||||
|
},
|
||||||
|
),
|
||||||
|
Starred(
|
||||||
|
ExprStarred {
|
||||||
|
range: 85..90,
|
||||||
|
value: Name(
|
||||||
|
ExprName {
|
||||||
|
range: 86..90,
|
||||||
|
id: Name("rest"),
|
||||||
|
ctx: Load,
|
||||||
|
},
|
||||||
|
),
|
||||||
|
ctx: Load,
|
||||||
|
},
|
||||||
|
),
|
||||||
|
],
|
||||||
|
ctx: Load,
|
||||||
|
parenthesized: false,
|
||||||
|
},
|
||||||
|
),
|
||||||
|
),
|
||||||
|
},
|
||||||
|
),
|
||||||
|
],
|
||||||
|
},
|
||||||
|
),
|
||||||
|
],
|
||||||
|
},
|
||||||
|
)
|
||||||
|
```
|
|
@ -0,0 +1,143 @@
|
||||||
|
---
|
||||||
|
source: crates/ruff_python_parser/tests/fixtures.rs
|
||||||
|
input_file: crates/ruff_python_parser/resources/inline/ok/iter_unpack_yield_py37.py
|
||||||
|
---
|
||||||
|
## AST
|
||||||
|
|
||||||
|
```
|
||||||
|
Module(
|
||||||
|
ModModule {
|
||||||
|
range: 0..92,
|
||||||
|
body: [
|
||||||
|
Assign(
|
||||||
|
StmtAssign {
|
||||||
|
range: 43..59,
|
||||||
|
targets: [
|
||||||
|
Name(
|
||||||
|
ExprName {
|
||||||
|
range: 43..47,
|
||||||
|
id: Name("rest"),
|
||||||
|
ctx: Store,
|
||||||
|
},
|
||||||
|
),
|
||||||
|
],
|
||||||
|
value: Tuple(
|
||||||
|
ExprTuple {
|
||||||
|
range: 50..59,
|
||||||
|
elts: [
|
||||||
|
NumberLiteral(
|
||||||
|
ExprNumberLiteral {
|
||||||
|
range: 51..52,
|
||||||
|
value: Int(
|
||||||
|
4,
|
||||||
|
),
|
||||||
|
},
|
||||||
|
),
|
||||||
|
NumberLiteral(
|
||||||
|
ExprNumberLiteral {
|
||||||
|
range: 54..55,
|
||||||
|
value: Int(
|
||||||
|
5,
|
||||||
|
),
|
||||||
|
},
|
||||||
|
),
|
||||||
|
NumberLiteral(
|
||||||
|
ExprNumberLiteral {
|
||||||
|
range: 57..58,
|
||||||
|
value: Int(
|
||||||
|
6,
|
||||||
|
),
|
||||||
|
},
|
||||||
|
),
|
||||||
|
],
|
||||||
|
ctx: Load,
|
||||||
|
parenthesized: true,
|
||||||
|
},
|
||||||
|
),
|
||||||
|
},
|
||||||
|
),
|
||||||
|
FunctionDef(
|
||||||
|
StmtFunctionDef {
|
||||||
|
range: 60..91,
|
||||||
|
is_async: false,
|
||||||
|
decorator_list: [],
|
||||||
|
name: Identifier {
|
||||||
|
id: Name("g"),
|
||||||
|
range: 64..65,
|
||||||
|
},
|
||||||
|
type_params: None,
|
||||||
|
parameters: Parameters {
|
||||||
|
range: 65..67,
|
||||||
|
posonlyargs: [],
|
||||||
|
args: [],
|
||||||
|
vararg: None,
|
||||||
|
kwonlyargs: [],
|
||||||
|
kwarg: None,
|
||||||
|
},
|
||||||
|
returns: None,
|
||||||
|
body: [
|
||||||
|
Expr(
|
||||||
|
StmtExpr {
|
||||||
|
range: 69..91,
|
||||||
|
value: Yield(
|
||||||
|
ExprYield {
|
||||||
|
range: 69..91,
|
||||||
|
value: Some(
|
||||||
|
Tuple(
|
||||||
|
ExprTuple {
|
||||||
|
range: 75..91,
|
||||||
|
elts: [
|
||||||
|
NumberLiteral(
|
||||||
|
ExprNumberLiteral {
|
||||||
|
range: 76..77,
|
||||||
|
value: Int(
|
||||||
|
1,
|
||||||
|
),
|
||||||
|
},
|
||||||
|
),
|
||||||
|
NumberLiteral(
|
||||||
|
ExprNumberLiteral {
|
||||||
|
range: 79..80,
|
||||||
|
value: Int(
|
||||||
|
2,
|
||||||
|
),
|
||||||
|
},
|
||||||
|
),
|
||||||
|
NumberLiteral(
|
||||||
|
ExprNumberLiteral {
|
||||||
|
range: 82..83,
|
||||||
|
value: Int(
|
||||||
|
3,
|
||||||
|
),
|
||||||
|
},
|
||||||
|
),
|
||||||
|
Starred(
|
||||||
|
ExprStarred {
|
||||||
|
range: 85..90,
|
||||||
|
value: Name(
|
||||||
|
ExprName {
|
||||||
|
range: 86..90,
|
||||||
|
id: Name("rest"),
|
||||||
|
ctx: Load,
|
||||||
|
},
|
||||||
|
),
|
||||||
|
ctx: Load,
|
||||||
|
},
|
||||||
|
),
|
||||||
|
],
|
||||||
|
ctx: Load,
|
||||||
|
parenthesized: true,
|
||||||
|
},
|
||||||
|
),
|
||||||
|
),
|
||||||
|
},
|
||||||
|
),
|
||||||
|
},
|
||||||
|
),
|
||||||
|
],
|
||||||
|
},
|
||||||
|
),
|
||||||
|
],
|
||||||
|
},
|
||||||
|
)
|
||||||
|
```
|
|
@ -0,0 +1,240 @@
|
||||||
|
---
|
||||||
|
source: crates/ruff_python_parser/tests/fixtures.rs
|
||||||
|
input_file: crates/ruff_python_parser/resources/inline/ok/iter_unpack_yield_py38.py
|
||||||
|
---
|
||||||
|
## AST
|
||||||
|
|
||||||
|
```
|
||||||
|
Module(
|
||||||
|
ModModule {
|
||||||
|
range: 0..128,
|
||||||
|
body: [
|
||||||
|
Assign(
|
||||||
|
StmtAssign {
|
||||||
|
range: 43..59,
|
||||||
|
targets: [
|
||||||
|
Name(
|
||||||
|
ExprName {
|
||||||
|
range: 43..47,
|
||||||
|
id: Name("rest"),
|
||||||
|
ctx: Store,
|
||||||
|
},
|
||||||
|
),
|
||||||
|
],
|
||||||
|
value: Tuple(
|
||||||
|
ExprTuple {
|
||||||
|
range: 50..59,
|
||||||
|
elts: [
|
||||||
|
NumberLiteral(
|
||||||
|
ExprNumberLiteral {
|
||||||
|
range: 51..52,
|
||||||
|
value: Int(
|
||||||
|
4,
|
||||||
|
),
|
||||||
|
},
|
||||||
|
),
|
||||||
|
NumberLiteral(
|
||||||
|
ExprNumberLiteral {
|
||||||
|
range: 54..55,
|
||||||
|
value: Int(
|
||||||
|
5,
|
||||||
|
),
|
||||||
|
},
|
||||||
|
),
|
||||||
|
NumberLiteral(
|
||||||
|
ExprNumberLiteral {
|
||||||
|
range: 57..58,
|
||||||
|
value: Int(
|
||||||
|
6,
|
||||||
|
),
|
||||||
|
},
|
||||||
|
),
|
||||||
|
],
|
||||||
|
ctx: Load,
|
||||||
|
parenthesized: true,
|
||||||
|
},
|
||||||
|
),
|
||||||
|
},
|
||||||
|
),
|
||||||
|
FunctionDef(
|
||||||
|
StmtFunctionDef {
|
||||||
|
range: 60..89,
|
||||||
|
is_async: false,
|
||||||
|
decorator_list: [],
|
||||||
|
name: Identifier {
|
||||||
|
id: Name("g"),
|
||||||
|
range: 64..65,
|
||||||
|
},
|
||||||
|
type_params: None,
|
||||||
|
parameters: Parameters {
|
||||||
|
range: 65..67,
|
||||||
|
posonlyargs: [],
|
||||||
|
args: [],
|
||||||
|
vararg: None,
|
||||||
|
kwonlyargs: [],
|
||||||
|
kwarg: None,
|
||||||
|
},
|
||||||
|
returns: None,
|
||||||
|
body: [
|
||||||
|
Expr(
|
||||||
|
StmtExpr {
|
||||||
|
range: 69..89,
|
||||||
|
value: Yield(
|
||||||
|
ExprYield {
|
||||||
|
range: 69..89,
|
||||||
|
value: Some(
|
||||||
|
Tuple(
|
||||||
|
ExprTuple {
|
||||||
|
range: 75..89,
|
||||||
|
elts: [
|
||||||
|
NumberLiteral(
|
||||||
|
ExprNumberLiteral {
|
||||||
|
range: 75..76,
|
||||||
|
value: Int(
|
||||||
|
1,
|
||||||
|
),
|
||||||
|
},
|
||||||
|
),
|
||||||
|
NumberLiteral(
|
||||||
|
ExprNumberLiteral {
|
||||||
|
range: 78..79,
|
||||||
|
value: Int(
|
||||||
|
2,
|
||||||
|
),
|
||||||
|
},
|
||||||
|
),
|
||||||
|
NumberLiteral(
|
||||||
|
ExprNumberLiteral {
|
||||||
|
range: 81..82,
|
||||||
|
value: Int(
|
||||||
|
3,
|
||||||
|
),
|
||||||
|
},
|
||||||
|
),
|
||||||
|
Starred(
|
||||||
|
ExprStarred {
|
||||||
|
range: 84..89,
|
||||||
|
value: Name(
|
||||||
|
ExprName {
|
||||||
|
range: 85..89,
|
||||||
|
id: Name("rest"),
|
||||||
|
ctx: Load,
|
||||||
|
},
|
||||||
|
),
|
||||||
|
ctx: Load,
|
||||||
|
},
|
||||||
|
),
|
||||||
|
],
|
||||||
|
ctx: Load,
|
||||||
|
parenthesized: false,
|
||||||
|
},
|
||||||
|
),
|
||||||
|
),
|
||||||
|
},
|
||||||
|
),
|
||||||
|
},
|
||||||
|
),
|
||||||
|
],
|
||||||
|
},
|
||||||
|
),
|
||||||
|
FunctionDef(
|
||||||
|
StmtFunctionDef {
|
||||||
|
range: 90..127,
|
||||||
|
is_async: false,
|
||||||
|
decorator_list: [],
|
||||||
|
name: Identifier {
|
||||||
|
id: Name("h"),
|
||||||
|
range: 94..95,
|
||||||
|
},
|
||||||
|
type_params: None,
|
||||||
|
parameters: Parameters {
|
||||||
|
range: 95..97,
|
||||||
|
posonlyargs: [],
|
||||||
|
args: [],
|
||||||
|
vararg: None,
|
||||||
|
kwonlyargs: [],
|
||||||
|
kwarg: None,
|
||||||
|
},
|
||||||
|
returns: None,
|
||||||
|
body: [
|
||||||
|
Expr(
|
||||||
|
StmtExpr {
|
||||||
|
range: 99..127,
|
||||||
|
value: Yield(
|
||||||
|
ExprYield {
|
||||||
|
range: 99..127,
|
||||||
|
value: Some(
|
||||||
|
Tuple(
|
||||||
|
ExprTuple {
|
||||||
|
range: 105..127,
|
||||||
|
elts: [
|
||||||
|
NumberLiteral(
|
||||||
|
ExprNumberLiteral {
|
||||||
|
range: 105..106,
|
||||||
|
value: Int(
|
||||||
|
1,
|
||||||
|
),
|
||||||
|
},
|
||||||
|
),
|
||||||
|
Yield(
|
||||||
|
ExprYield {
|
||||||
|
range: 109..123,
|
||||||
|
value: Some(
|
||||||
|
Tuple(
|
||||||
|
ExprTuple {
|
||||||
|
range: 115..123,
|
||||||
|
elts: [
|
||||||
|
NumberLiteral(
|
||||||
|
ExprNumberLiteral {
|
||||||
|
range: 115..116,
|
||||||
|
value: Int(
|
||||||
|
2,
|
||||||
|
),
|
||||||
|
},
|
||||||
|
),
|
||||||
|
Starred(
|
||||||
|
ExprStarred {
|
||||||
|
range: 118..123,
|
||||||
|
value: Name(
|
||||||
|
ExprName {
|
||||||
|
range: 119..123,
|
||||||
|
id: Name("rest"),
|
||||||
|
ctx: Load,
|
||||||
|
},
|
||||||
|
),
|
||||||
|
ctx: Load,
|
||||||
|
},
|
||||||
|
),
|
||||||
|
],
|
||||||
|
ctx: Load,
|
||||||
|
parenthesized: false,
|
||||||
|
},
|
||||||
|
),
|
||||||
|
),
|
||||||
|
},
|
||||||
|
),
|
||||||
|
NumberLiteral(
|
||||||
|
ExprNumberLiteral {
|
||||||
|
range: 126..127,
|
||||||
|
value: Int(
|
||||||
|
3,
|
||||||
|
),
|
||||||
|
},
|
||||||
|
),
|
||||||
|
],
|
||||||
|
ctx: Load,
|
||||||
|
parenthesized: false,
|
||||||
|
},
|
||||||
|
),
|
||||||
|
),
|
||||||
|
},
|
||||||
|
),
|
||||||
|
},
|
||||||
|
),
|
||||||
|
],
|
||||||
|
},
|
||||||
|
),
|
||||||
|
],
|
||||||
|
},
|
||||||
|
)
|
||||||
|
```
|
Loading…
Add table
Add a link
Reference in a new issue