xref: /third_party/python/Doc/library/symtable.rst (revision 7db96d56)
17db96d56Sopenharmony_ci:mod:`symtable` --- Access to the compiler's symbol tables
27db96d56Sopenharmony_ci==========================================================
37db96d56Sopenharmony_ci
47db96d56Sopenharmony_ci.. module:: symtable
57db96d56Sopenharmony_ci   :synopsis: Interface to the compiler's internal symbol tables.
67db96d56Sopenharmony_ci
77db96d56Sopenharmony_ci**Source code:** :source:`Lib/symtable.py`
87db96d56Sopenharmony_ci
97db96d56Sopenharmony_ci--------------
107db96d56Sopenharmony_ci
117db96d56Sopenharmony_ci.. moduleauthor:: Jeremy Hylton <jeremy@alum.mit.edu>
127db96d56Sopenharmony_ci.. sectionauthor:: Benjamin Peterson <benjamin@python.org>
137db96d56Sopenharmony_ci
147db96d56Sopenharmony_ci
157db96d56Sopenharmony_ciSymbol tables are generated by the compiler from AST just before bytecode is
167db96d56Sopenharmony_cigenerated.  The symbol table is responsible for calculating the scope of every
177db96d56Sopenharmony_ciidentifier in the code.  :mod:`symtable` provides an interface to examine these
187db96d56Sopenharmony_citables.
197db96d56Sopenharmony_ci
207db96d56Sopenharmony_ci
217db96d56Sopenharmony_ciGenerating Symbol Tables
227db96d56Sopenharmony_ci------------------------
237db96d56Sopenharmony_ci
247db96d56Sopenharmony_ci.. function:: symtable(code, filename, compile_type)
257db96d56Sopenharmony_ci
267db96d56Sopenharmony_ci   Return the toplevel :class:`SymbolTable` for the Python source *code*.
277db96d56Sopenharmony_ci   *filename* is the name of the file containing the code.  *compile_type* is
287db96d56Sopenharmony_ci   like the *mode* argument to :func:`compile`.
297db96d56Sopenharmony_ci
307db96d56Sopenharmony_ci
317db96d56Sopenharmony_ciExamining Symbol Tables
327db96d56Sopenharmony_ci-----------------------
337db96d56Sopenharmony_ci
347db96d56Sopenharmony_ci.. class:: SymbolTable
357db96d56Sopenharmony_ci
367db96d56Sopenharmony_ci   A namespace table for a block.  The constructor is not public.
377db96d56Sopenharmony_ci
387db96d56Sopenharmony_ci   .. method:: get_type()
397db96d56Sopenharmony_ci
407db96d56Sopenharmony_ci      Return the type of the symbol table.  Possible values are ``'class'``,
417db96d56Sopenharmony_ci      ``'module'``, and ``'function'``.
427db96d56Sopenharmony_ci
437db96d56Sopenharmony_ci   .. method:: get_id()
447db96d56Sopenharmony_ci
457db96d56Sopenharmony_ci      Return the table's identifier.
467db96d56Sopenharmony_ci
477db96d56Sopenharmony_ci   .. method:: get_name()
487db96d56Sopenharmony_ci
497db96d56Sopenharmony_ci      Return the table's name.  This is the name of the class if the table is
507db96d56Sopenharmony_ci      for a class, the name of the function if the table is for a function, or
517db96d56Sopenharmony_ci      ``'top'`` if the table is global (:meth:`get_type` returns ``'module'``).
527db96d56Sopenharmony_ci
537db96d56Sopenharmony_ci   .. method:: get_lineno()
547db96d56Sopenharmony_ci
557db96d56Sopenharmony_ci      Return the number of the first line in the block this table represents.
567db96d56Sopenharmony_ci
577db96d56Sopenharmony_ci   .. method:: is_optimized()
587db96d56Sopenharmony_ci
597db96d56Sopenharmony_ci      Return ``True`` if the locals in this table can be optimized.
607db96d56Sopenharmony_ci
617db96d56Sopenharmony_ci   .. method:: is_nested()
627db96d56Sopenharmony_ci
637db96d56Sopenharmony_ci      Return ``True`` if the block is a nested class or function.
647db96d56Sopenharmony_ci
657db96d56Sopenharmony_ci   .. method:: has_children()
667db96d56Sopenharmony_ci
677db96d56Sopenharmony_ci      Return ``True`` if the block has nested namespaces within it.  These can
687db96d56Sopenharmony_ci      be obtained with :meth:`get_children`.
697db96d56Sopenharmony_ci
707db96d56Sopenharmony_ci   .. method:: get_identifiers()
717db96d56Sopenharmony_ci
727db96d56Sopenharmony_ci      Return a view object containing the names of symbols in the table.
737db96d56Sopenharmony_ci      See the :ref:`documentation of view objects <dict-views>`.
747db96d56Sopenharmony_ci
757db96d56Sopenharmony_ci   .. method:: lookup(name)
767db96d56Sopenharmony_ci
777db96d56Sopenharmony_ci      Lookup *name* in the table and return a :class:`Symbol` instance.
787db96d56Sopenharmony_ci
797db96d56Sopenharmony_ci   .. method:: get_symbols()
807db96d56Sopenharmony_ci
817db96d56Sopenharmony_ci      Return a list of :class:`Symbol` instances for names in the table.
827db96d56Sopenharmony_ci
837db96d56Sopenharmony_ci   .. method:: get_children()
847db96d56Sopenharmony_ci
857db96d56Sopenharmony_ci      Return a list of the nested symbol tables.
867db96d56Sopenharmony_ci
877db96d56Sopenharmony_ci
887db96d56Sopenharmony_ci.. class:: Function
897db96d56Sopenharmony_ci
907db96d56Sopenharmony_ci   A namespace for a function or method.  This class inherits
917db96d56Sopenharmony_ci   :class:`SymbolTable`.
927db96d56Sopenharmony_ci
937db96d56Sopenharmony_ci   .. method:: get_parameters()
947db96d56Sopenharmony_ci
957db96d56Sopenharmony_ci      Return a tuple containing names of parameters to this function.
967db96d56Sopenharmony_ci
977db96d56Sopenharmony_ci   .. method:: get_locals()
987db96d56Sopenharmony_ci
997db96d56Sopenharmony_ci      Return a tuple containing names of locals in this function.
1007db96d56Sopenharmony_ci
1017db96d56Sopenharmony_ci   .. method:: get_globals()
1027db96d56Sopenharmony_ci
1037db96d56Sopenharmony_ci      Return a tuple containing names of globals in this function.
1047db96d56Sopenharmony_ci
1057db96d56Sopenharmony_ci   .. method:: get_nonlocals()
1067db96d56Sopenharmony_ci
1077db96d56Sopenharmony_ci      Return a tuple containing names of nonlocals in this function.
1087db96d56Sopenharmony_ci
1097db96d56Sopenharmony_ci   .. method:: get_frees()
1107db96d56Sopenharmony_ci
1117db96d56Sopenharmony_ci      Return a tuple containing names of free variables in this function.
1127db96d56Sopenharmony_ci
1137db96d56Sopenharmony_ci
1147db96d56Sopenharmony_ci.. class:: Class
1157db96d56Sopenharmony_ci
1167db96d56Sopenharmony_ci   A namespace of a class.  This class inherits :class:`SymbolTable`.
1177db96d56Sopenharmony_ci
1187db96d56Sopenharmony_ci   .. method:: get_methods()
1197db96d56Sopenharmony_ci
1207db96d56Sopenharmony_ci      Return a tuple containing the names of methods declared in the class.
1217db96d56Sopenharmony_ci
1227db96d56Sopenharmony_ci
1237db96d56Sopenharmony_ci.. class:: Symbol
1247db96d56Sopenharmony_ci
1257db96d56Sopenharmony_ci   An entry in a :class:`SymbolTable` corresponding to an identifier in the
1267db96d56Sopenharmony_ci   source.  The constructor is not public.
1277db96d56Sopenharmony_ci
1287db96d56Sopenharmony_ci   .. method:: get_name()
1297db96d56Sopenharmony_ci
1307db96d56Sopenharmony_ci      Return the symbol's name.
1317db96d56Sopenharmony_ci
1327db96d56Sopenharmony_ci   .. method:: is_referenced()
1337db96d56Sopenharmony_ci
1347db96d56Sopenharmony_ci      Return ``True`` if the symbol is used in its block.
1357db96d56Sopenharmony_ci
1367db96d56Sopenharmony_ci   .. method:: is_imported()
1377db96d56Sopenharmony_ci
1387db96d56Sopenharmony_ci      Return ``True`` if the symbol is created from an import statement.
1397db96d56Sopenharmony_ci
1407db96d56Sopenharmony_ci   .. method:: is_parameter()
1417db96d56Sopenharmony_ci
1427db96d56Sopenharmony_ci      Return ``True`` if the symbol is a parameter.
1437db96d56Sopenharmony_ci
1447db96d56Sopenharmony_ci   .. method:: is_global()
1457db96d56Sopenharmony_ci
1467db96d56Sopenharmony_ci      Return ``True`` if the symbol is global.
1477db96d56Sopenharmony_ci
1487db96d56Sopenharmony_ci   .. method:: is_nonlocal()
1497db96d56Sopenharmony_ci
1507db96d56Sopenharmony_ci      Return ``True`` if the symbol is nonlocal.
1517db96d56Sopenharmony_ci
1527db96d56Sopenharmony_ci   .. method:: is_declared_global()
1537db96d56Sopenharmony_ci
1547db96d56Sopenharmony_ci      Return ``True`` if the symbol is declared global with a global statement.
1557db96d56Sopenharmony_ci
1567db96d56Sopenharmony_ci   .. method:: is_local()
1577db96d56Sopenharmony_ci
1587db96d56Sopenharmony_ci      Return ``True`` if the symbol is local to its block.
1597db96d56Sopenharmony_ci
1607db96d56Sopenharmony_ci   .. method:: is_annotated()
1617db96d56Sopenharmony_ci
1627db96d56Sopenharmony_ci      Return ``True`` if the symbol is annotated.
1637db96d56Sopenharmony_ci
1647db96d56Sopenharmony_ci      .. versionadded:: 3.6
1657db96d56Sopenharmony_ci
1667db96d56Sopenharmony_ci   .. method:: is_free()
1677db96d56Sopenharmony_ci
1687db96d56Sopenharmony_ci      Return ``True`` if the symbol is referenced in its block, but not assigned
1697db96d56Sopenharmony_ci      to.
1707db96d56Sopenharmony_ci
1717db96d56Sopenharmony_ci   .. method:: is_assigned()
1727db96d56Sopenharmony_ci
1737db96d56Sopenharmony_ci      Return ``True`` if the symbol is assigned to in its block.
1747db96d56Sopenharmony_ci
1757db96d56Sopenharmony_ci   .. method:: is_namespace()
1767db96d56Sopenharmony_ci
1777db96d56Sopenharmony_ci      Return ``True`` if name binding introduces new namespace.
1787db96d56Sopenharmony_ci
1797db96d56Sopenharmony_ci      If the name is used as the target of a function or class statement, this
1807db96d56Sopenharmony_ci      will be true.
1817db96d56Sopenharmony_ci
1827db96d56Sopenharmony_ci      For example::
1837db96d56Sopenharmony_ci
1847db96d56Sopenharmony_ci         >>> table = symtable.symtable("def some_func(): pass", "string", "exec")
1857db96d56Sopenharmony_ci         >>> table.lookup("some_func").is_namespace()
1867db96d56Sopenharmony_ci         True
1877db96d56Sopenharmony_ci
1887db96d56Sopenharmony_ci      Note that a single name can be bound to multiple objects.  If the result
1897db96d56Sopenharmony_ci      is ``True``, the name may also be bound to other objects, like an int or
1907db96d56Sopenharmony_ci      list, that does not introduce a new namespace.
1917db96d56Sopenharmony_ci
1927db96d56Sopenharmony_ci   .. method:: get_namespaces()
1937db96d56Sopenharmony_ci
1947db96d56Sopenharmony_ci      Return a list of namespaces bound to this name.
1957db96d56Sopenharmony_ci
1967db96d56Sopenharmony_ci   .. method:: get_namespace()
1977db96d56Sopenharmony_ci
1987db96d56Sopenharmony_ci      Return the namespace bound to this name. If more than one or no namespace
1997db96d56Sopenharmony_ci      is bound to this name, a :exc:`ValueError` is raised.
200