bpo-6691: Pyclbr now reports nested classes and functions. (#2503)

Original patch by Guilherme Polo.  Revisions by Cheryl Sabella.
This commit is contained in:
csabella 2017-07-03 21:31:25 -04:00 committed by terryjreedy
parent 6969eaf468
commit 246ff3bd00
3 changed files with 354 additions and 202 deletions

View file

@ -10,93 +10,63 @@
--------------
The :mod:`pyclbr` module can be used to determine some limited information
about the classes, methods and top-level functions defined in a module. The
information provided is sufficient to implement a traditional three-pane
class browser. The information is extracted from the source code rather
than by importing the module, so this module is safe to use with untrusted
code. This restriction makes it impossible to use this module with modules
not implemented in Python, including all standard and optional extension
The :mod:`pyclbr` module provides limited information about the
functions, classes, and methods defined in a python-coded module. The
information is sufficient to implement a module browser. The
information is extracted from the python source code rather than by
importing the module, so this module is safe to use with untrusted code.
This restriction makes it impossible to use this module with modules not
implemented in Python, including all standard and optional extension
modules.
.. function:: readmodule(module, path=None)
Read a module and return a dictionary mapping class names to class
descriptor objects. The parameter *module* should be the name of a
module as a string; it may be the name of a module within a package. The
*path* parameter should be a sequence, and is used to augment the value
of ``sys.path``, which is used to locate module source code.
Return a dictionary mapping module-level class names to class
descriptors. If possible, descriptors for imported base classes are
included. Parameter *module* is a string with the name of the module
to read; it may be the name of a module within a package. If given,
*path* is a sequence of directory paths prepended to ``sys.path``,
which is used to locate the module source code.
.. function:: readmodule_ex(module, path=None)
Like :func:`readmodule`, but the returned dictionary, in addition to
mapping class names to class descriptor objects, also maps top-level
function names to function descriptor objects. Moreover, if the module
being read is a package, the key ``'__path__'`` in the returned
dictionary has as its value a list which contains the package search
path.
Return a dictionary-based tree containing a function or class
descriptors for each function and class defined in the module with a
``def`` or ``class`` statement. The returned dictionary maps
module-level function and class names to their descriptors. Nested
objects are entered into the children dictionary of their parent. As
with readmodule, *module* names the module to be read and *path* is
prepended to sys.path. If the module being read is a package, the
returned dictionary has a key ``'__path__'`` whose value is a list
containing the package search path.
.. versionadded:: 3.7
Descriptors for nested definitions. They are accessed through the
new children attibute. Each has a new parent attribute.
.. _pyclbr-class-objects:
Class Objects
-------------
The :class:`Class` objects used as values in the dictionary returned by
:func:`readmodule` and :func:`readmodule_ex` provide the following data
attributes:
.. attribute:: Class.module
The name of the module defining the class described by the class descriptor.
.. attribute:: Class.name
The name of the class.
.. attribute:: Class.super
A list of :class:`Class` objects which describe the immediate base
classes of the class being described. Classes which are named as
superclasses but which are not discoverable by :func:`readmodule` are
listed as a string with the class name instead of as :class:`Class`
objects.
.. attribute:: Class.methods
A dictionary mapping method names to line numbers.
.. attribute:: Class.file
Name of the file containing the ``class`` statement defining the class.
.. attribute:: Class.lineno
The line number of the ``class`` statement within the file named by
:attr:`~Class.file`.
The descriptors returned by these functions are instances of
Function and Class classes. Users are not expected to create instances
of these classes.
.. _pyclbr-function-objects:
Function Objects
----------------
Class :class:`Function` instances describe functions defined by def
statements. They have the following attributes:
The :class:`Function` objects used as values in the dictionary returned by
:func:`readmodule_ex` provide the following attributes:
.. attribute:: Function.file
Name of the file in which the function is defined.
.. attribute:: Function.module
The name of the module defining the function described by the function
descriptor.
The name of the module defining the function described.
.. attribute:: Function.name
@ -104,13 +74,80 @@ The :class:`Function` objects used as values in the dictionary returned by
The name of the function.
.. attribute:: Function.file
Name of the file containing the ``def`` statement defining the function.
.. attribute:: Function.lineno
The line number of the ``def`` statement within the file named by
:attr:`~Function.file`.
The line number in the file where the definition starts.
.. attribute:: Function.parent
For top-level functions, None. For nested functions, the parent.
.. versionadded:: 3.7
.. attribute:: Function.children
A dictionary mapping names to descriptors for nested functions and
classes.
.. versionadded:: 3.7
.. _pyclbr-class-objects:
Class Objects
-------------
Class :class:`Class` instances describe classes defined by class
statements. They have the same attributes as Functions and two more.
.. attribute:: Class.file
Name of the file in which the class is defined.
.. attribute:: Class.module
The name of the module defining the class described.
.. attribute:: Class.name
The name of the class.
.. attribute:: Class.lineno
The line number in the file where the definition starts.
.. attribute:: Class.parent
For top-level classes, None. For nested classes, the parent.
.. versionadded:: 3.7
.. attribute:: Class.children
A dictionary mapping names to descriptors for nested functions and
classes.
.. versionadded:: 3.7
.. attribute:: Class.super
A list of :class:`Class` objects which describe the immediate base
classes of the class being described. Classes which are named as
superclasses but which are not discoverable by :func:`readmodule_ex`
are listed as a string with the class name instead of as
:class:`Class` objects.
.. attribute:: Class.methods
A dictionary mapping method names to line numbers. This can be
derived from the newer children dictionary, but remains for
back-compatibility.