mirror of
https://github.com/python/cpython.git
synced 2025-09-26 18:29:57 +00:00
gh-104799: PEP 695 backward compatibility for ast.unparse (#105846)
This commit is contained in:
parent
70c075c194
commit
957a974d4f
3 changed files with 80 additions and 3 deletions
|
@ -1051,7 +1051,8 @@ class _Unparser(NodeVisitor):
|
||||||
self.fill("@")
|
self.fill("@")
|
||||||
self.traverse(deco)
|
self.traverse(deco)
|
||||||
self.fill("class " + node.name)
|
self.fill("class " + node.name)
|
||||||
self._type_params_helper(node.type_params)
|
if hasattr(node, "type_params"):
|
||||||
|
self._type_params_helper(node.type_params)
|
||||||
with self.delimit_if("(", ")", condition = node.bases or node.keywords):
|
with self.delimit_if("(", ")", condition = node.bases or node.keywords):
|
||||||
comma = False
|
comma = False
|
||||||
for e in node.bases:
|
for e in node.bases:
|
||||||
|
@ -1083,7 +1084,8 @@ class _Unparser(NodeVisitor):
|
||||||
self.traverse(deco)
|
self.traverse(deco)
|
||||||
def_str = fill_suffix + " " + node.name
|
def_str = fill_suffix + " " + node.name
|
||||||
self.fill(def_str)
|
self.fill(def_str)
|
||||||
self._type_params_helper(node.type_params)
|
if hasattr(node, "type_params"):
|
||||||
|
self._type_params_helper(node.type_params)
|
||||||
with self.delimit("(", ")"):
|
with self.delimit("(", ")"):
|
||||||
self.traverse(node.args)
|
self.traverse(node.args)
|
||||||
if node.returns:
|
if node.returns:
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
"""Tests for the unparse.py script in the Tools/parser directory."""
|
"""Tests for ast.unparse."""
|
||||||
|
|
||||||
import unittest
|
import unittest
|
||||||
import test.support
|
import test.support
|
||||||
|
@ -625,6 +625,78 @@ class CosmeticTestCase(ASTTestCase):
|
||||||
self.check_src_roundtrip("a, b = [c, d] = e, f = g")
|
self.check_src_roundtrip("a, b = [c, d] = e, f = g")
|
||||||
|
|
||||||
|
|
||||||
|
class ManualASTCreationTestCase(unittest.TestCase):
|
||||||
|
"""Test that AST nodes created without a type_params field unparse correctly."""
|
||||||
|
|
||||||
|
def test_class(self):
|
||||||
|
node = ast.ClassDef(name="X", bases=[], keywords=[], body=[ast.Pass()], decorator_list=[])
|
||||||
|
ast.fix_missing_locations(node)
|
||||||
|
self.assertEqual(ast.unparse(node), "class X:\n pass")
|
||||||
|
|
||||||
|
def test_class_with_type_params(self):
|
||||||
|
node = ast.ClassDef(name="X", bases=[], keywords=[], body=[ast.Pass()], decorator_list=[],
|
||||||
|
type_params=[ast.TypeVar("T")])
|
||||||
|
ast.fix_missing_locations(node)
|
||||||
|
self.assertEqual(ast.unparse(node), "class X[T]:\n pass")
|
||||||
|
|
||||||
|
def test_function(self):
|
||||||
|
node = ast.FunctionDef(
|
||||||
|
name="f",
|
||||||
|
args=ast.arguments(posonlyargs=[], args=[], vararg=None, kwonlyargs=[], kw_defaults=[], kwarg=None, defaults=[]),
|
||||||
|
body=[ast.Pass()],
|
||||||
|
decorator_list=[],
|
||||||
|
returns=None,
|
||||||
|
)
|
||||||
|
ast.fix_missing_locations(node)
|
||||||
|
self.assertEqual(ast.unparse(node), "def f():\n pass")
|
||||||
|
|
||||||
|
def test_function_with_type_params(self):
|
||||||
|
node = ast.FunctionDef(
|
||||||
|
name="f",
|
||||||
|
args=ast.arguments(posonlyargs=[], args=[], vararg=None, kwonlyargs=[], kw_defaults=[], kwarg=None, defaults=[]),
|
||||||
|
body=[ast.Pass()],
|
||||||
|
decorator_list=[],
|
||||||
|
returns=None,
|
||||||
|
type_params=[ast.TypeVar("T")],
|
||||||
|
)
|
||||||
|
ast.fix_missing_locations(node)
|
||||||
|
self.assertEqual(ast.unparse(node), "def f[T]():\n pass")
|
||||||
|
|
||||||
|
def test_function_with_type_params_and_bound(self):
|
||||||
|
node = ast.FunctionDef(
|
||||||
|
name="f",
|
||||||
|
args=ast.arguments(posonlyargs=[], args=[], vararg=None, kwonlyargs=[], kw_defaults=[], kwarg=None, defaults=[]),
|
||||||
|
body=[ast.Pass()],
|
||||||
|
decorator_list=[],
|
||||||
|
returns=None,
|
||||||
|
type_params=[ast.TypeVar("T", bound=ast.Name("int"))],
|
||||||
|
)
|
||||||
|
ast.fix_missing_locations(node)
|
||||||
|
self.assertEqual(ast.unparse(node), "def f[T: int]():\n pass")
|
||||||
|
|
||||||
|
def test_async_function(self):
|
||||||
|
node = ast.AsyncFunctionDef(
|
||||||
|
name="f",
|
||||||
|
args=ast.arguments(posonlyargs=[], args=[], vararg=None, kwonlyargs=[], kw_defaults=[], kwarg=None, defaults=[]),
|
||||||
|
body=[ast.Pass()],
|
||||||
|
decorator_list=[],
|
||||||
|
returns=None,
|
||||||
|
)
|
||||||
|
ast.fix_missing_locations(node)
|
||||||
|
self.assertEqual(ast.unparse(node), "async def f():\n pass")
|
||||||
|
|
||||||
|
def test_async_function_with_type_params(self):
|
||||||
|
node = ast.AsyncFunctionDef(
|
||||||
|
name="f",
|
||||||
|
args=ast.arguments(posonlyargs=[], args=[], vararg=None, kwonlyargs=[], kw_defaults=[], kwarg=None, defaults=[]),
|
||||||
|
body=[ast.Pass()],
|
||||||
|
decorator_list=[],
|
||||||
|
returns=None,
|
||||||
|
type_params=[ast.TypeVar("T")],
|
||||||
|
)
|
||||||
|
ast.fix_missing_locations(node)
|
||||||
|
self.assertEqual(ast.unparse(node), "async def f[T]():\n pass")
|
||||||
|
|
||||||
|
|
||||||
class DirectoryTestCase(ASTTestCase):
|
class DirectoryTestCase(ASTTestCase):
|
||||||
"""Test roundtrip behaviour on all files in Lib and Lib/test."""
|
"""Test roundtrip behaviour on all files in Lib and Lib/test."""
|
||||||
|
|
|
@ -0,0 +1,3 @@
|
||||||
|
Enable :func:`ast.unparse` to unparse function and class definitions created
|
||||||
|
without the new ``type_params`` field from :pep:`695`. Patch by Jelle
|
||||||
|
Zijlstra.
|
Loading…
Add table
Add a link
Reference in a new issue