Close #15387: inspect.getmodulename() now uses a new importlib.machinery.all_suffixes() API rather than the deprecated inspect.getmoduleinfo()
This commit is contained in:
parent
90db661b43
commit
76e077001d
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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.
|
||||
|
||||
|
|
Loading…
Reference in New Issue