[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