gh-121914: Change the names of the symbol tables for lambda and genex… · python/cpython@da699ed · GitHub
Skip to content

Commit da699ed

Browse files
gh-121914: Change the names of the symbol tables for lambda and genexpr (GH-135288)
Change the names of the symbol tables for lambda expressions and generator expressions to "<lambda>" and "<genexpr>" respectively to avoid conflicts with user-defined names.
1 parent 85ec3b3 commit da699ed

8 files changed

Lines changed: 60 additions & 52 deletions

Include/internal/pycore_global_objects_fini_generated.h

Lines changed: 0 additions & 5 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Include/internal/pycore_global_strings.h

Lines changed: 0 additions & 5 deletions

Include/internal/pycore_runtime_init_generated.h

Lines changed: 0 additions & 5 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Include/internal/pycore_unicodeobject_generated.h

Lines changed: 0 additions & 20 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Lib/symtable.py

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -255,25 +255,13 @@ def is_local_symbol(ident):
255255
if is_local_symbol(st.name):
256256
match st.type:
257257
case _symtable.TYPE_FUNCTION:
258-
# generators are of type TYPE_FUNCTION with a ".0"
259-
# parameter as a first parameter (which makes them
260-
# distinguishable from a function named 'genexpr')
261-
if st.name == 'genexpr' and '.0' in st.varnames:
262-
continue
263258
d[st.name] = 1
264259
case _symtable.TYPE_TYPE_PARAMETERS:
265260
# Get the function-def block in the annotation
266261
# scope 'st' with the same identifier, if any.
267262
scope_name = st.name
268263
for c in st.children:
269264
if c.name == scope_name and c.type == _symtable.TYPE_FUNCTION:
270-
# A generic generator of type TYPE_FUNCTION
271-
# cannot be a direct child of 'st' (but it
272-
# can be a descendant), e.g.:
273-
#
274-
# class A:
275-
# type genexpr[genexpr] = (x for x in [])
276-
assert scope_name != 'genexpr' or '.0' not in c.varnames
277265
d[scope_name] = 1
278266
break
279267
self.__methods = tuple(d)

Lib/test/test_symtable.py

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -527,6 +527,58 @@ def test_symtable_entry_repr(self):
527527
expected = f"<symtable entry top({self.top.get_id()}), line {self.top.get_lineno()}>"
528528
self.assertEqual(repr(self.top._table), expected)
529529

530+
def test_lambda(self):
531+
st = symtable.symtable("lambda x: x", "?", "exec")
532+
self.assertEqual(len(st.get_children()), 1)
533+
st = st.get_children()[0]
534+
self.assertIs(st.get_type(), symtable.SymbolTableType.FUNCTION)
535+
self.assertEqual(st.get_name(), "<lambda>")
536+
self.assertFalse(st.is_nested())
537+
self.assertEqual(sorted(st.get_identifiers()), ["x"])
538+
self.assertEqual(st.get_children(), [])
539+
540+
def test_nested_lambda(self):
541+
st = symtable.symtable("lambda x: lambda y=x: y", "?", "exec")
542+
self.assertEqual(len(st.get_children()), 1)
543+
st = st.get_children()[0]
544+
self.assertIs(st.get_type(), symtable.SymbolTableType.FUNCTION)
545+
self.assertEqual(st.get_name(), "<lambda>")
546+
self.assertFalse(st.is_nested())
547+
self.assertEqual(sorted(st.get_identifiers()), ["x"])
548+
self.assertEqual(len(st.get_children()), 1)
549+
st = st.get_children()[0]
550+
self.assertIs(st.get_type(), symtable.SymbolTableType.FUNCTION)
551+
self.assertEqual(st.get_name(), "<lambda>")
552+
self.assertTrue(st.is_nested())
553+
self.assertEqual(sorted(st.get_identifiers()), ["y"])
554+
self.assertEqual(st.get_children(), [])
555+
556+
def test_genexpr(self):
557+
st = symtable.symtable("(x for x in a)", "?", "exec")
558+
self.assertEqual(len(st.get_children()), 1)
559+
st = st.get_children()[0]
560+
self.assertIs(st.get_type(), symtable.SymbolTableType.FUNCTION)
561+
self.assertEqual(st.get_name(), "<genexpr>")
562+
self.assertFalse(st.is_nested())
563+
self.assertEqual(sorted(st.get_identifiers()), [".0", "x"])
564+
self.assertEqual(st.get_children(), [])
565+
566+
def test_nested_genexpr(self):
567+
st = symtable.symtable("((y for y in x) for x in a)", "?", "exec")
568+
self.assertEqual(len(st.get_children()), 1)
569+
st = st.get_children()[0]
570+
self.assertIs(st.get_type(), symtable.SymbolTableType.FUNCTION)
571+
self.assertEqual(st.get_name(), "<genexpr>")
572+
self.assertFalse(st.is_nested())
573+
self.assertEqual(sorted(st.get_identifiers()), [".0", "x"])
574+
self.assertEqual(len(st.get_children()), 1)
575+
st = st.get_children()[0]
576+
self.assertIs(st.get_type(), symtable.SymbolTableType.FUNCTION)
577+
self.assertEqual(st.get_name(), "<genexpr>")
578+
self.assertTrue(st.is_nested())
579+
self.assertEqual(sorted(st.get_identifiers()), [".0", "y"])
580+
self.assertEqual(st.get_children(), [])
581+
530582

531583
class ComprehensionTests(unittest.TestCase):
532584
def get_identifiers_recursive(self, st, res):
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
Changed the names of the symbol tables for lambda expressions and generator
2+
expressions to "<lambda>" and "<genexpr>" respectively to avoid conflicts
3+
with user-defined names.

Python/symtable.c

Lines changed: 5 additions & 5 deletions

0 commit comments

Comments
 (0)