From e966af7cff78e14e1d289db587433504b4b53533 Mon Sep 17 00:00:00 2001 From: Batuhan Taskaya Date: Sun, 17 May 2020 01:49:07 +0300 Subject: [PATCH] bpo-38870: Correctly handle empty docstrings in ast.unparse (GH-18768) Co-authored-by: Pablo Galindo --- Lib/ast.py | 13 ++++++++----- Lib/test/test_unparse.py | 15 +++++++++++++-- 2 files changed, 21 insertions(+), 7 deletions(-) diff --git a/Lib/ast.py b/Lib/ast.py index d6cb334432c..5d0171f1072 100644 --- a/Lib/ast.py +++ b/Lib/ast.py @@ -1075,11 +1075,14 @@ class _Unparser(NodeVisitor): if node.kind == "u": self.write("u") - # Preserve quotes in the docstring by escaping them - value = node.value.replace("\\", "\\\\") - value = value.replace('"""', '""\"') - if value[-1] == '"': - value = value.replace('"', '\\"', -1) + value = node.value + if value: + # Preserve quotes in the docstring by escaping them + value = value.replace("\\", "\\\\") + value = value.replace('"""', '""\"') + value = value.replace("\r", "\\r") + if value[-1] == '"': + value = value.replace('"', '\\"', -1) self.write(f'"""{value}"""') diff --git a/Lib/test/test_unparse.py b/Lib/test/test_unparse.py index 410df7dbb75..4f5742852e2 100644 --- a/Lib/test/test_unparse.py +++ b/Lib/test/test_unparse.py @@ -313,11 +313,18 @@ class UnparseTestCase(ASTTestCase): def test_docstrings(self): docstrings = ( 'this ends with double quote"', - 'this includes a """triple quote"""' + 'this includes a """triple quote"""', + '\r', + '\\r', + '\t', + '\\t', + '\n', + '\\n', + '\r\\r\t\\t\n\\n' ) for docstring in docstrings: # check as Module docstrings for easy testing - self.check_ast_roundtrip(f"'{docstring}'") + self.check_ast_roundtrip(f"'''{docstring}'''") def test_constant_tuples(self): self.check_src_roundtrip(ast.Constant(value=(1,), kind=None), "(1,)") @@ -390,6 +397,10 @@ class CosmeticTestCase(ASTTestCase): empty newline"""''', '"""With some \t"""', '"""Foo "bar" baz """', + '"""\\r"""', + '""""""', + '"""\'\'\'"""', + '"""\'\'\'\'\'\'"""', ) for prefix in docstring_prefixes: