summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Doc/library/symtable.rst4
-rw-r--r--Lib/symtable.py17
-rw-r--r--Lib/test/test_symtable.py2
-rw-r--r--Misc/NEWS.d/next/Library/2024-06-04-14-54-46.gh-issue-120029._1YdTf.rst2
-rw-r--r--Modules/symtablemodule.c4
5 files changed, 24 insertions, 5 deletions
diff --git a/Doc/library/symtable.rst b/Doc/library/symtable.rst
index 0480502..e17a33f 100644
--- a/Doc/library/symtable.rst
+++ b/Doc/library/symtable.rst
@@ -151,6 +151,10 @@ Examining Symbol Tables
Return ``True`` if the symbol is a parameter.
+ .. method:: is_type_parameter()
+
+ Return ``True`` if the symbol is a type parameter.
+
.. method:: is_global()
Return ``True`` if the symbol is global.
diff --git a/Lib/symtable.py b/Lib/symtable.py
index 17f820a..ba2f0da 100644
--- a/Lib/symtable.py
+++ b/Lib/symtable.py
@@ -1,9 +1,13 @@
"""Interface to the compiler's internal symbol tables"""
import _symtable
-from _symtable import (USE, DEF_GLOBAL, DEF_NONLOCAL, DEF_LOCAL, DEF_PARAM,
- DEF_IMPORT, DEF_BOUND, DEF_ANNOT, SCOPE_OFF, SCOPE_MASK, FREE,
- LOCAL, GLOBAL_IMPLICIT, GLOBAL_EXPLICIT, CELL)
+from _symtable import (
+ USE,
+ DEF_GLOBAL, DEF_NONLOCAL, DEF_LOCAL,
+ DEF_PARAM, DEF_TYPE_PARAM, DEF_IMPORT, DEF_BOUND, DEF_ANNOT,
+ SCOPE_OFF, SCOPE_MASK,
+ FREE, LOCAL, GLOBAL_IMPLICIT, GLOBAL_EXPLICIT, CELL
+)
import weakref
@@ -253,13 +257,18 @@ class Symbol:
"""Return *True* if the symbol is used in
its block.
"""
- return bool(self.__flags & _symtable.USE)
+ return bool(self.__flags & USE)
def is_parameter(self):
"""Return *True* if the symbol is a parameter.
"""
return bool(self.__flags & DEF_PARAM)
+ def is_type_parameter(self):
+ """Return *True* if the symbol is a type parameter.
+ """
+ return bool(self.__flags & DEF_TYPE_PARAM)
+
def is_global(self):
"""Return *True* if the symbol is global.
"""
diff --git a/Lib/test/test_symtable.py b/Lib/test/test_symtable.py
index 92b78a8..ef2a228 100644
--- a/Lib/test/test_symtable.py
+++ b/Lib/test/test_symtable.py
@@ -299,6 +299,8 @@ class SymtableTest(unittest.TestCase):
"<symbol 'x': FREE, USE>")
self.assertEqual(repr(self.other_internal.lookup("some_var")),
"<symbol 'some_var': FREE, USE|DEF_NONLOCAL|DEF_LOCAL>")
+ self.assertEqual(repr(self.GenericMine.lookup("T")),
+ "<symbol 'T': LOCAL, DEF_LOCAL|DEF_TYPE_PARAM>")
def test_symtable_entry_repr(self):
expected = f"<symtable entry top({self.top.get_id()}), line {self.top.get_lineno()}>"
diff --git a/Misc/NEWS.d/next/Library/2024-06-04-14-54-46.gh-issue-120029._1YdTf.rst b/Misc/NEWS.d/next/Library/2024-06-04-14-54-46.gh-issue-120029._1YdTf.rst
new file mode 100644
index 0000000..e8ea107
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2024-06-04-14-54-46.gh-issue-120029._1YdTf.rst
@@ -0,0 +1,2 @@
+Expose :meth:`symtable.Symbol.is_type_parameter` in the :mod:`symtable`
+module. Patch by Bénédikt Tran.
diff --git a/Modules/symtablemodule.c b/Modules/symtablemodule.c
index b4dbb54..63c4dd4 100644
--- a/Modules/symtablemodule.c
+++ b/Modules/symtablemodule.c
@@ -75,6 +75,7 @@ symtable_init_constants(PyObject *m)
if (PyModule_AddIntMacro(m, DEF_NONLOCAL) < 0) return -1;
if (PyModule_AddIntMacro(m, DEF_LOCAL) < 0) return -1;
if (PyModule_AddIntMacro(m, DEF_PARAM) < 0) return -1;
+ if (PyModule_AddIntMacro(m, DEF_TYPE_PARAM) < 0) return -1;
if (PyModule_AddIntMacro(m, DEF_FREE) < 0) return -1;
if (PyModule_AddIntMacro(m, DEF_FREE_CLASS) < 0) return -1;
if (PyModule_AddIntMacro(m, DEF_IMPORT) < 0) return -1;
@@ -83,7 +84,8 @@ symtable_init_constants(PyObject *m)
if (PyModule_AddIntConstant(m, "TYPE_FUNCTION", FunctionBlock) < 0)
return -1;
- if (PyModule_AddIntConstant(m, "TYPE_CLASS", ClassBlock) < 0) return -1;
+ if (PyModule_AddIntConstant(m, "TYPE_CLASS", ClassBlock) < 0)
+ return -1;
if (PyModule_AddIntConstant(m, "TYPE_MODULE", ModuleBlock) < 0)
return -1;
if (PyModule_AddIntConstant(m, "TYPE_ANNOTATION", AnnotationBlock) < 0)