[Python-checkins] cpython: Close #15387: inspect.getmodulename() now uses a new

Jim Jewett jimjjewett at gmail.com
Wed Jul 18 18:50:30 CEST 2012


Why is inspect.getmoduleinfo() deprecated?  Is it just to remove
circular dependencies?

FWIW, I much prefer an API like:

    tell_me_about(object)

to one like:

    for test_data in (X, Y, Z):
        usable = tester(object, test_data)
        if valid(usable):
            return possible_results[test_data]

and to me, inspect.getmoduleinfo(path) looks like the first, while
checking the various import.machinery.*SUFFIXES looks like the second.

-jJ

On 7/18/12, nick.coghlan <python-checkins at python.org> wrote:
> http://hg.python.org/cpython/rev/af7961e1c362
> changeset:   78161:af7961e1c362
> user:        Nick Coghlan <ncoghlan at gmail.com>
> date:        Wed Jul 18 23:14:57 2012 +1000
> summary:
>   Close #15387: inspect.getmodulename() now uses a new
> importlib.machinery.all_suffixes() API rather than the deprecated
> inspect.getmoduleinfo()
>
> files:
>   Doc/library/importlib.rst  |  13 ++++++++++++-
>   Doc/library/inspect.rst    |  15 ++++++++++++---
>   Lib/importlib/machinery.py |   4 ++++
>   Lib/inspect.py             |  11 +++++++++--
>   Misc/NEWS                  |   3 +++
>   5 files changed, 40 insertions(+), 6 deletions(-)
>
>
> diff --git a/Doc/library/importlib.rst b/Doc/library/importlib.rst
> --- a/Doc/library/importlib.rst
> +++ b/Doc/library/importlib.rst
> @@ -533,12 +533,23 @@
>
>  .. attribute:: EXTENSION_SUFFIXES
>
> -   A list of strings representing the the recognized file suffixes for
> +   A list of strings representing the recognized file suffixes for
>     extension modules.
>
>     .. versionadded:: 3.3
>
>
> +.. func:: all_suffixes()
> +
> +   Returns a combined list of strings representing all file suffixes for
> +   Python modules recognized by the standard import machinery. This is a
> +   helper for code which simply needs to know if a filesystem path
> +   potentially represents a Python module (for example,
> +   :func:`inspect.getmodulename`)
> +
> +   .. versionadded:: 3.3
> +
> +
>  .. class:: BuiltinImporter
>
>      An :term:`importer` for built-in modules. All known built-in modules
> are
> diff --git a/Doc/library/inspect.rst b/Doc/library/inspect.rst
> --- a/Doc/library/inspect.rst
> +++ b/Doc/library/inspect.rst
> @@ -198,9 +198,18 @@
>  .. function:: getmodulename(path)
>
>     Return the name of the module named by the file *path*, without
> including the
> -   names of enclosing packages.  This uses the same algorithm as the
> interpreter
> -   uses when searching for modules.  If the name cannot be matched
> according to the
> -   interpreter's rules, ``None`` is returned.
> +   names of enclosing packages. The file extension is checked against all
> of
> +   the entries in :func:`importlib.machinery.all_suffixes`. If it matches,
> +   the final path component is returned with the extension removed.
> +   Otherwise, ``None`` is returned.
> +
> +   Note that this function *only* returns a meaningful name for actual
> +   Python modules - paths that potentially refer to Python packages will
> +   still return ``None``.
> +
> +   .. versionchanged:: 3.3
> +      This function is now based directly on :mod:`importlib` rather than
> the
> +      deprecated :func:`getmoduleinfo`.
>
>
>  .. function:: ismodule(object)
> diff --git a/Lib/importlib/machinery.py b/Lib/importlib/machinery.py
> --- a/Lib/importlib/machinery.py
> +++ b/Lib/importlib/machinery.py
> @@ -13,3 +13,7 @@
>  from ._bootstrap import ExtensionFileLoader
>
>  EXTENSION_SUFFIXES = _imp.extension_suffixes()
> +
> +def all_suffixes():
> +    """Returns a list of all recognized module suffixes for this process"""
> +    return SOURCE_SUFFIXES + BYTECODE_SUFFIXES + EXTENSION_SUFFIXES
> diff --git a/Lib/inspect.py b/Lib/inspect.py
> --- a/Lib/inspect.py
> +++ b/Lib/inspect.py
> @@ -450,8 +450,15 @@
>
>  def getmodulename(path):
>      """Return the module name for a given file, or None."""
> -    info = getmoduleinfo(path)
> -    if info: return info[0]
> +    fname = os.path.basename(path)
> +    # Check for paths that look like an actual module file
> +    suffixes = [(-len(suffix), suffix)
> +                    for suffix in importlib.machinery.all_suffixes()]
> +    suffixes.sort() # try longest suffixes first, in case they overlap
> +    for neglen, suffix in suffixes:
> +        if fname.endswith(suffix):
> +            return fname[:neglen]
> +    return None
>
>  def getsourcefile(object):
>      """Return the filename that can be used to locate an object's source.
> diff --git a/Misc/NEWS b/Misc/NEWS
> --- a/Misc/NEWS
> +++ b/Misc/NEWS
> @@ -41,6 +41,9 @@
>  Library
>  -------
>
> +- Issue #15397: inspect.getmodulename() is now based directly on importlib
> +  via a new importlib.machinery.all_suffixes() API.
> +
>  - Issue #14635: telnetlib will use poll() rather than select() when
> possible
>    to avoid failing due to the select() file descriptor limit.
>
>
> --
> Repository URL: http://hg.python.org/cpython
>


More information about the Python-checkins mailing list