gh-143504: Expose CELL status of a symbol in symtable (#143549)

This commit is contained in:
Yashraj 2026-01-25 20:51:27 +05:30 committed by GitHub
parent 979d92fefc
commit a51bf70f95
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 37 additions and 0 deletions

View File

@ -180,6 +180,12 @@ Examining Symbol Tables
Return a tuple containing names of :term:`free (closure) variables <closure variable>`
in this function.
.. method:: get_cells()
Return a tuple containing names of :term:`cell variables <closure variable>` in this table.
.. versionadded:: next
.. class:: Class
@ -291,6 +297,12 @@ Examining Symbol Tables
Return ``True`` if the symbol is referenced in its block, but not assigned
to.
.. method:: is_cell()
Return ``True`` if the symbol is referenced but not assigned in a nested block.
.. versionadded:: next
.. method:: is_free_class()
Return *True* if a class-scoped symbol is free from

View File

@ -737,6 +737,13 @@ ssl
(Contributed by Ron Frederick in :gh:`138252`.)
symtable
--------
* Add :meth:`symtable.Function.get_cells` and :meth:`symtable.Symbol.is_cell` methods.
(Contributed by Yashp002 in :gh:`143504`.)
sys
---

View File

@ -184,6 +184,7 @@ class Function(SymbolTable):
__frees = None
__globals = None
__nonlocals = None
__cells = None
def __idents_matching(self, test_func):
return tuple(ident for ident in self.get_identifiers()
@ -229,6 +230,14 @@ class Function(SymbolTable):
self.__frees = self.__idents_matching(is_free)
return self.__frees
def get_cells(self):
"""Return a tuple of cell variables in the function.
"""
if self.__cells is None:
is_cell = lambda x: _get_scope(x) == CELL
self.__cells = self.__idents_matching(is_cell)
return self.__cells
class Class(SymbolTable):
@ -342,6 +351,10 @@ class Symbol:
"""
return bool(self.__scope == FREE)
def is_cell(self):
"""Return *True* if the symbol is a cell variable."""
return bool(self.__scope == CELL)
def is_free_class(self):
"""Return *True* if a class-scoped symbol is free from
the perspective of a method."""

View File

@ -255,6 +255,7 @@ class SymtableTest(unittest.TestCase):
self.assertEqual(sorted(func.get_locals()), expected)
self.assertEqual(sorted(func.get_globals()), ["bar", "glob", "some_assigned_global_var"])
self.assertEqual(self.internal.get_frees(), ("x",))
self.assertEqual(self.spam.get_cells(), ("some_var", "x",))
def test_globals(self):
self.assertTrue(self.spam.lookup("glob").is_global())
@ -284,6 +285,9 @@ class SymtableTest(unittest.TestCase):
def test_free(self):
self.assertTrue(self.internal.lookup("x").is_free())
def test_cells(self):
self.assertTrue(self.spam.lookup("x").is_cell())
def test_referenced(self):
self.assertTrue(self.internal.lookup("x").is_referenced())
self.assertTrue(self.spam.lookup("internal").is_referenced())

View File

@ -0,0 +1 @@
Add :meth:`symtable.Function.get_cells` and :meth:`symtable.Symbol.is_cell` methods.