Skip to content

Commit 2bf9047

Browse files
Receive any AST node in parse
1 parent d5c51fc commit 2bf9047

File tree

2 files changed

+62
-20
lines changed

2 files changed

+62
-20
lines changed
Lines changed: 27 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,44 @@
11
import ast
22
from typing_extensions import assert_type
33

4-
# Test with Module input
4+
# Test with source code strings
5+
assert_type(ast.parse("x = 1"), ast.Module)
6+
assert_type(ast.parse("x = 1", mode="exec"), ast.Module)
7+
assert_type(ast.parse("1 + 1", mode="eval"), ast.Expression)
8+
assert_type(ast.parse("x = 1", mode="single"), ast.Interactive)
9+
assert_type(ast.parse("(int, str) -> None", mode="func_type"), ast.FunctionType)
10+
11+
# Test with mod objects - Module
512
mod1: ast.Module = ast.Module([], [])
613
assert_type(ast.parse(mod1), ast.Module)
714
assert_type(ast.parse(mod1, mode="exec"), ast.Module)
815
mod2: ast.Module = ast.Module(body=[ast.Expr(value=ast.Constant(value=42))], type_ignores=[])
916
assert_type(ast.parse(mod2), ast.Module)
1017

11-
# Test with Expression input
18+
# Test with mod objects - Expression
1219
expr1: ast.Expression = ast.Expression(body=ast.Constant(value=42))
1320
assert_type(ast.parse(expr1, mode="eval"), ast.Expression)
1421

15-
# Test with Interactive input
22+
# Test with mod objects - Interactive
1623
inter1: ast.Interactive = ast.Interactive(body=[])
1724
assert_type(ast.parse(inter1, mode="single"), ast.Interactive)
1825

19-
# Test with FunctionType input
26+
# Test with mod objects - FunctionType
2027
func1: ast.FunctionType = ast.FunctionType(argtypes=[], returns=ast.Constant(value=None))
2128
assert_type(ast.parse(func1, mode="func_type"), ast.FunctionType)
29+
30+
# Test any AST node can be passed and returns the same type
31+
binop: ast.BinOp = ast.BinOp(left=ast.Constant(1), op=ast.Add(), right=ast.Constant(2))
32+
assert_type(ast.parse(binop), ast.BinOp)
33+
34+
funcdef: ast.FunctionDef = ast.FunctionDef(name="foo", args=ast.arguments(), body=[], decorator_list=[])
35+
assert_type(ast.parse(funcdef), ast.FunctionDef)
36+
37+
constant: ast.Constant = ast.Constant(value=42)
38+
assert_type(ast.parse(constant), ast.Constant)
39+
40+
# Test with additional parameters
41+
assert_type(ast.parse(mod1, filename="test.py"), ast.Module)
42+
assert_type(ast.parse(mod1, type_comments=True), ast.Module)
43+
assert_type(ast.parse(mod1, feature_version=(3, 10)), ast.Module)
44+
assert_type(ast.parse(binop, filename="test.py"), ast.BinOp)

stdlib/ast.pyi

Lines changed: 35 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1746,7 +1746,17 @@ _T = _TypeVar("_T", bound=AST)
17461746
if sys.version_info >= (3, 13):
17471747
@overload
17481748
def parse(
1749-
source: str | ReadableBuffer | mod,
1749+
source: _T,
1750+
filename: str | ReadableBuffer | os.PathLike[Any] = "<unknown>",
1751+
mode: Literal["exec", "eval", "func_type", "single"] = "exec",
1752+
*,
1753+
type_comments: bool = False,
1754+
feature_version: None | int | tuple[int, int] = None,
1755+
optimize: Literal[-1, 0, 1, 2] = -1,
1756+
) -> _T: ...
1757+
@overload
1758+
def parse(
1759+
source: str | ReadableBuffer,
17501760
filename: str | ReadableBuffer | os.PathLike[Any] = "<unknown>",
17511761
mode: Literal["exec"] = "exec",
17521762
*,
@@ -1756,7 +1766,7 @@ if sys.version_info >= (3, 13):
17561766
) -> Module: ...
17571767
@overload
17581768
def parse(
1759-
source: str | ReadableBuffer | mod,
1769+
source: str | ReadableBuffer,
17601770
filename: str | ReadableBuffer | os.PathLike[Any],
17611771
mode: Literal["eval"],
17621772
*,
@@ -1766,7 +1776,7 @@ if sys.version_info >= (3, 13):
17661776
) -> Expression: ...
17671777
@overload
17681778
def parse(
1769-
source: str | ReadableBuffer | mod,
1779+
source: str | ReadableBuffer,
17701780
filename: str | ReadableBuffer | os.PathLike[Any],
17711781
mode: Literal["func_type"],
17721782
*,
@@ -1776,7 +1786,7 @@ if sys.version_info >= (3, 13):
17761786
) -> FunctionType: ...
17771787
@overload
17781788
def parse(
1779-
source: str | ReadableBuffer | mod,
1789+
source: str | ReadableBuffer,
17801790
filename: str | ReadableBuffer | os.PathLike[Any],
17811791
mode: Literal["single"],
17821792
*,
@@ -1786,7 +1796,7 @@ if sys.version_info >= (3, 13):
17861796
) -> Interactive: ...
17871797
@overload
17881798
def parse(
1789-
source: str | ReadableBuffer | mod,
1799+
source: str | ReadableBuffer,
17901800
*,
17911801
mode: Literal["eval"],
17921802
type_comments: bool = False,
@@ -1795,7 +1805,7 @@ if sys.version_info >= (3, 13):
17951805
) -> Expression: ...
17961806
@overload
17971807
def parse(
1798-
source: str | ReadableBuffer | mod,
1808+
source: str | ReadableBuffer,
17991809
*,
18001810
mode: Literal["func_type"],
18011811
type_comments: bool = False,
@@ -1804,7 +1814,7 @@ if sys.version_info >= (3, 13):
18041814
) -> FunctionType: ...
18051815
@overload
18061816
def parse(
1807-
source: str | ReadableBuffer | mod,
1817+
source: str | ReadableBuffer,
18081818
*,
18091819
mode: Literal["single"],
18101820
type_comments: bool = False,
@@ -1813,7 +1823,7 @@ if sys.version_info >= (3, 13):
18131823
) -> Interactive: ...
18141824
@overload
18151825
def parse(
1816-
source: str | ReadableBuffer | mod,
1826+
source: str | ReadableBuffer,
18171827
filename: str | ReadableBuffer | os.PathLike[Any] = "<unknown>",
18181828
mode: str = "exec",
18191829
*,
@@ -1825,7 +1835,16 @@ if sys.version_info >= (3, 13):
18251835
else:
18261836
@overload
18271837
def parse(
1828-
source: str | ReadableBuffer | mod,
1838+
source: _T,
1839+
filename: str | ReadableBuffer | os.PathLike[Any] = "<unknown>",
1840+
mode: Literal["exec", "eval", "func_type", "single"] = "exec",
1841+
*,
1842+
type_comments: bool = False,
1843+
feature_version: None | int | tuple[int, int] = None,
1844+
) -> _T: ...
1845+
@overload
1846+
def parse(
1847+
source: str | ReadableBuffer,
18291848
filename: str | ReadableBuffer | os.PathLike[Any] = "<unknown>",
18301849
mode: Literal["exec"] = "exec",
18311850
*,
@@ -1834,7 +1853,7 @@ else:
18341853
) -> Module: ...
18351854
@overload
18361855
def parse(
1837-
source: str | ReadableBuffer | mod,
1856+
source: str | ReadableBuffer,
18381857
filename: str | ReadableBuffer | os.PathLike[Any],
18391858
mode: Literal["eval"],
18401859
*,
@@ -1843,7 +1862,7 @@ else:
18431862
) -> Expression: ...
18441863
@overload
18451864
def parse(
1846-
source: str | ReadableBuffer | mod,
1865+
source: str | ReadableBuffer,
18471866
filename: str | ReadableBuffer | os.PathLike[Any],
18481867
mode: Literal["func_type"],
18491868
*,
@@ -1852,7 +1871,7 @@ else:
18521871
) -> FunctionType: ...
18531872
@overload
18541873
def parse(
1855-
source: str | ReadableBuffer | mod,
1874+
source: str | ReadableBuffer,
18561875
filename: str | ReadableBuffer | os.PathLike[Any],
18571876
mode: Literal["single"],
18581877
*,
@@ -1861,31 +1880,31 @@ else:
18611880
) -> Interactive: ...
18621881
@overload
18631882
def parse(
1864-
source: str | ReadableBuffer | mod,
1883+
source: str | ReadableBuffer,
18651884
*,
18661885
mode: Literal["eval"],
18671886
type_comments: bool = False,
18681887
feature_version: None | int | tuple[int, int] = None,
18691888
) -> Expression: ...
18701889
@overload
18711890
def parse(
1872-
source: str | ReadableBuffer | mod,
1891+
source: str | ReadableBuffer,
18731892
*,
18741893
mode: Literal["func_type"],
18751894
type_comments: bool = False,
18761895
feature_version: None | int | tuple[int, int] = None,
18771896
) -> FunctionType: ...
18781897
@overload
18791898
def parse(
1880-
source: str | ReadableBuffer | mod,
1899+
source: str | ReadableBuffer,
18811900
*,
18821901
mode: Literal["single"],
18831902
type_comments: bool = False,
18841903
feature_version: None | int | tuple[int, int] = None,
18851904
) -> Interactive: ...
18861905
@overload
18871906
def parse(
1888-
source: str | ReadableBuffer | mod,
1907+
source: str | ReadableBuffer,
18891908
filename: str | ReadableBuffer | os.PathLike[Any] = "<unknown>",
18901909
mode: str = "exec",
18911910
*,

0 commit comments

Comments
 (0)