[Python-checkins] bpo-40528: fix is_simple(sum)s behavior for attributes (GH-26918)

isidentical webhook-mailer at python.org
Sun Jun 27 10:58:41 EDT 2021


https://github.com/python/cpython/commit/107a2c59c91b3911bdd6dfdb83271c588c506a5a
commit: 107a2c59c91b3911bdd6dfdb83271c588c506a5a
branch: main
author: Batuhan Taskaya <batuhan at python.org>
committer: isidentical <isidentical at gmail.com>
date: 2021-06-27T17:58:32+03:00
summary:

bpo-40528: fix is_simple(sum)s behavior for attributes (GH-26918)

This is something I noticed while (now discontinued) experimenting
with the idea of annotating operators with location information. Unfortunately
without this addition, adding any `attributes` to stuff like `unaryop`
doesn't change anything since the code assumes they are singletons and
caches all instances. This patch fixes this assumption with including
the attributes as well as constructor fields.

files:
M Parser/asdl_c.py

diff --git a/Parser/asdl_c.py b/Parser/asdl_c.py
index 21e50442b8bb7..5f0b89bba4489 100755
--- a/Parser/asdl_c.py
+++ b/Parser/asdl_c.py
@@ -71,16 +71,20 @@ def reflow_lines(s, depth):
 def reflow_c_string(s, depth):
     return '"%s"' % s.replace('\n', '\\n"\n%s"' % (' ' * depth * TABSIZE))
 
-def is_simple(sum):
+def is_simple(sum_type):
     """Return True if a sum is a simple.
 
-    A sum is simple if its types have no fields, e.g.
+    A sum is simple if it's types have no fields and itself
+    doesn't have any attributes. Instances of these types are
+    cached at C level, and they act like singletons when propagating
+    parser generated nodes into Python level, e.g.
     unaryop = Invert | Not | UAdd | USub
     """
-    for t in sum.types:
-        if t.fields:
-            return False
-    return True
+
+    return not (
+        sum_type.attributes or
+        any(constructor.fields for constructor in sum_type.types)
+    )
 
 def asdl_of(name, obj):
     if isinstance(obj, asdl.Product) or isinstance(obj, asdl.Constructor):



More information about the Python-checkins mailing list