Close #15387: inspect.getmodulename() now uses a new importlib.machinery.all_suffixes() API rather than the deprecated inspect.getmoduleinfo()

This commit is contained in:
Nick Coghlan 2012-07-18 23:14:57 +10:00
parent 90db661b43
commit 76e077001d
5 changed files with 40 additions and 6 deletions

View File

@ -533,12 +533,23 @@ find and load modules.
.. 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

View File

@ -198,9 +198,18 @@ attributes:
.. 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)

View File

@ -13,3 +13,7 @@ from ._bootstrap import SourcelessFileLoader
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

View File

@ -450,8 +450,15 @@ def getmoduleinfo(path):
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.

View File

@ -41,6 +41,9 @@ Core and Builtins
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.