summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJelle Zijlstra <jelle.zijlstra@gmail.com>2024-05-09 22:30:14 (GMT)
committerGitHub <noreply@github.com>2024-05-09 22:30:14 (GMT)
commit68fbc00dc870f6a8dcbecd2ec19298e21015867f (patch)
tree64510f6aeda5d45d63c36142818b9d25f03750d5
parent98ff3f65c0232f31df89ebb52b244625ec9e3eb6 (diff)
downloadcpython-68fbc00dc870f6a8dcbecd2ec19298e21015867f.zip
cpython-68fbc00dc870f6a8dcbecd2ec19298e21015867f.tar.gz
cpython-68fbc00dc870f6a8dcbecd2ec19298e21015867f.tar.bz2
gh-118851: Default ctx arguments to AST constructors to Load() (#118854)
Co-authored-by: Alex Waygood <Alex.Waygood@Gmail.com>
-rw-r--r--Doc/library/ast.rst6
-rw-r--r--Doc/whatsnew/3.13.rst8
-rw-r--r--Lib/test/test_ast.py17
-rw-r--r--Misc/NEWS.d/next/Library/2024-05-09-08-46-12.gh-issue-118851.aPAoJw.rst2
-rwxr-xr-xParser/asdl_c.py7
-rw-r--r--Python/Python-ast.c7
6 files changed, 41 insertions, 6 deletions
diff --git a/Doc/library/ast.rst b/Doc/library/ast.rst
index 24c56f1..d4ccf28 100644
--- a/Doc/library/ast.rst
+++ b/Doc/library/ast.rst
@@ -120,7 +120,8 @@ Node classes
If a field that is optional in the grammar is omitted from the constructor,
it defaults to ``None``. If a list field is omitted, it defaults to the empty
- list. If any other field is omitted, a :exc:`DeprecationWarning` is raised
+ list. If a field of type :class:`!ast.expr_context` is omitted, it defaults to
+ :class:`Load() <ast.Load>`. If any other field is omitted, a :exc:`DeprecationWarning` is raised
and the AST node will not have this field. In Python 3.15, this condition will
raise an error.
@@ -596,8 +597,7 @@ Expressions
* ``keywords`` holds a list of :class:`.keyword` objects representing
arguments passed by keyword.
- When creating a ``Call`` node, ``args`` and ``keywords`` are required, but
- they can be empty lists.
+ The ``args`` and ``keywords`` arguments are optional and default to empty lists.
.. doctest::
diff --git a/Doc/whatsnew/3.13.rst b/Doc/whatsnew/3.13.rst
index 4455571..9dab458 100644
--- a/Doc/whatsnew/3.13.rst
+++ b/Doc/whatsnew/3.13.rst
@@ -521,8 +521,10 @@ ast
If an optional field on an AST node is not included as an argument when
constructing an instance, the field will now be set to ``None``. Similarly,
- if a list field is omitted, that field will now be set to an empty list.
- (Previously, in both cases, the attribute would be missing on the newly
+ if a list field is omitted, that field will now be set to an empty list,
+ and if a :class:`!ast.expr_context` field is omitted, it defaults to
+ :class:`Load() <ast.Load>`.
+ (Previously, in all cases, the attribute would be missing on the newly
constructed AST node instance.)
If other arguments are omitted, a :exc:`DeprecationWarning` is emitted.
@@ -534,7 +536,7 @@ ast
unless the class opts in to the new behavior by setting the attribute
:attr:`ast.AST._field_types`.
- (Contributed by Jelle Zijlstra in :gh:`105858` and :gh:`117486`.)
+ (Contributed by Jelle Zijlstra in :gh:`105858`, :gh:`117486`, and :gh:`118851`.)
* :func:`ast.parse` now accepts an optional argument *optimize*
which is passed on to the :func:`compile` built-in. This makes it
diff --git a/Lib/test/test_ast.py b/Lib/test/test_ast.py
index f6e22d4..5422c86 100644
--- a/Lib/test/test_ast.py
+++ b/Lib/test/test_ast.py
@@ -3036,6 +3036,23 @@ class ASTConstructorTests(unittest.TestCase):
self.assertEqual(node.name, 'foo')
self.assertEqual(node.decorator_list, [])
+ def test_expr_context(self):
+ name = ast.Name("x")
+ self.assertEqual(name.id, "x")
+ self.assertIsInstance(name.ctx, ast.Load)
+
+ name2 = ast.Name("x", ast.Store())
+ self.assertEqual(name2.id, "x")
+ self.assertIsInstance(name2.ctx, ast.Store)
+
+ name3 = ast.Name("x", ctx=ast.Del())
+ self.assertEqual(name3.id, "x")
+ self.assertIsInstance(name3.ctx, ast.Del)
+
+ with self.assertWarnsRegex(DeprecationWarning,
+ r"Name\.__init__ missing 1 required positional argument: 'id'"):
+ name3 = ast.Name()
+
def test_custom_subclass_with_no_fields(self):
class NoInit(ast.AST):
pass
diff --git a/Misc/NEWS.d/next/Library/2024-05-09-08-46-12.gh-issue-118851.aPAoJw.rst b/Misc/NEWS.d/next/Library/2024-05-09-08-46-12.gh-issue-118851.aPAoJw.rst
new file mode 100644
index 0000000..d036d0c
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2024-05-09-08-46-12.gh-issue-118851.aPAoJw.rst
@@ -0,0 +1,2 @@
+``ctx`` arguments to the constructors of :mod:`ast` node classes now default
+to :class:`ast.Load() <ast.Load>`. Patch by Jelle Zijlstra.
diff --git a/Parser/asdl_c.py b/Parser/asdl_c.py
index 11d59fa..9961d23 100755
--- a/Parser/asdl_c.py
+++ b/Parser/asdl_c.py
@@ -1022,6 +1022,13 @@ ast_type_init(PyObject *self, PyObject *args, PyObject *kw)
goto set_remaining_cleanup;
}
}
+ else if (type == state->expr_context_type) {
+ // special case for expr_context: default to Load()
+ res = PyObject_SetAttr(self, name, state->Load_singleton);
+ if (res < 0) {
+ goto set_remaining_cleanup;
+ }
+ }
else {
// simple field (e.g., identifier)
if (PyErr_WarnFormat(
diff --git a/Python/Python-ast.c b/Python/Python-ast.c
index 4956d04..7aa1c51 100644
--- a/Python/Python-ast.c
+++ b/Python/Python-ast.c
@@ -5221,6 +5221,13 @@ ast_type_init(PyObject *self, PyObject *args, PyObject *kw)
goto set_remaining_cleanup;
}
}
+ else if (type == state->expr_context_type) {
+ // special case for expr_context: default to Load()
+ res = PyObject_SetAttr(self, name, state->Load_singleton);
+ if (res < 0) {
+ goto set_remaining_cleanup;
+ }
+ }
else {
// simple field (e.g., identifier)
if (PyErr_WarnFormat(