From 5b66ec166b81c8a77286da2c0d17be3579c3069a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Batuhan=20Ta=C5=9Fkaya?= <47358913+isidentical@users.noreply.github.com> Date: Sun, 15 Mar 2020 22:56:57 +0300 Subject: [PATCH] bpo-38870: Implement support for ast.FunctionType in ast.unparse (GH-19016) --- Lib/ast.py | 9 +++++++++ Lib/test/test_unparse.py | 14 +++++++++++--- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/Lib/ast.py b/Lib/ast.py index 077eb92abb4..e347d8b9dab 100644 --- a/Lib/ast.py +++ b/Lib/ast.py @@ -741,6 +741,15 @@ class _Unparser(NodeVisitor): def visit_Module(self, node): self._write_docstring_and_traverse_body(node) + def visit_FunctionType(self, node): + with self.delimit("(", ")"): + self.interleave( + lambda: self.write(", "), self.traverse, node.argtypes + ) + + self.write(" -> ") + self.traverse(node.returns) + def visit_Expr(self, node): self.fill() self.set_precedence(_Precedence.YIELD, node.value) diff --git a/Lib/test/test_unparse.py b/Lib/test/test_unparse.py index 3d87cfb6dae..23292640086 100644 --- a/Lib/test/test_unparse.py +++ b/Lib/test/test_unparse.py @@ -122,10 +122,10 @@ class ASTTestCase(unittest.TestCase): def assertASTEqual(self, ast1, ast2): self.assertEqual(ast.dump(ast1), ast.dump(ast2)) - def check_ast_roundtrip(self, code1): - ast1 = ast.parse(code1) + def check_ast_roundtrip(self, code1, **kwargs): + ast1 = ast.parse(code1, **kwargs) code2 = ast.unparse(ast1) - ast2 = ast.parse(code2) + ast2 = ast.parse(code2, **kwargs) self.assertASTEqual(ast1, ast2) def check_invalid(self, node, raises=ValueError): @@ -330,6 +330,14 @@ class UnparseTestCase(ASTTestCase): ast.Constant(value=(1, 2, 3), kind=None), "(1, 2, 3)" ) + def test_function_type(self): + for function_type in ( + "() -> int", + "(int, int) -> int", + "(Callable[complex], More[Complex(call.to_typevar())]) -> None" + ): + self.check_ast_roundtrip(function_type, mode="func_type") + class CosmeticTestCase(ASTTestCase): """Test if there are cosmetic issues caused by unnecesary additions"""