mirror of
https://github.com/python/cpython.git
synced 2025-07-22 18:55:22 +00:00

svn+ssh://pythondev@svn.python.org/python/branches/py3k ........ r74107 | brett.cannon | 2009-07-19 20:19:18 -0700 (Sun, 19 Jul 2009) | 8 lines Importlib's documentation said that importlib.abc.PyLoader inherited from importlib.abc.ResourceLoader, when in fact it did not. Fixed the ABC to inherit as documented. This does in introduce an backwards-incompatiblity as the code in PyLoader already required the single method ResourceLoader defined as an abstract method. ........
122 lines
3.6 KiB
Python
122 lines
3.6 KiB
Python
"""Abstract base classes related to import."""
|
|
from . import _bootstrap
|
|
from . import machinery
|
|
import abc
|
|
import types
|
|
|
|
|
|
class Loader(metaclass=abc.ABCMeta):
|
|
|
|
"""Abstract base class for import loaders."""
|
|
|
|
@abc.abstractmethod
|
|
def load_module(self, fullname:str) -> types.ModuleType:
|
|
"""Abstract method which when implemented should load a module."""
|
|
raise NotImplementedError
|
|
|
|
|
|
class Finder(metaclass=abc.ABCMeta):
|
|
|
|
"""Abstract base class for import finders."""
|
|
|
|
@abc.abstractmethod
|
|
def find_module(self, fullname:str, path:[str]=None) -> Loader:
|
|
"""Abstract method which when implemented should find a module."""
|
|
raise NotImplementedError
|
|
|
|
Finder.register(machinery.BuiltinImporter)
|
|
Finder.register(machinery.FrozenImporter)
|
|
Finder.register(machinery.PathFinder)
|
|
|
|
|
|
class ResourceLoader(Loader):
|
|
|
|
"""Abstract base class for loaders which can return data from their
|
|
back-end storage.
|
|
|
|
This ABC represents one of the optional protocols specified by PEP 302.
|
|
|
|
"""
|
|
|
|
@abc.abstractmethod
|
|
def get_data(self, path:str) -> bytes:
|
|
"""Abstract method which when implemented should return the bytes for
|
|
the specified path."""
|
|
raise NotImplementedError
|
|
|
|
|
|
class InspectLoader(Loader):
|
|
|
|
"""Abstract base class for loaders which support inspection about the
|
|
modules they can load.
|
|
|
|
This ABC represents one of the optional protocols specified by PEP 302.
|
|
|
|
"""
|
|
|
|
@abc.abstractmethod
|
|
def is_package(self, fullname:str) -> bool:
|
|
"""Abstract method which when implemented should return whether the
|
|
module is a package."""
|
|
return NotImplementedError
|
|
|
|
@abc.abstractmethod
|
|
def get_code(self, fullname:str) -> types.CodeType:
|
|
"""Abstract method which when implemented should return the code object
|
|
for the module"""
|
|
return NotImplementedError
|
|
|
|
@abc.abstractmethod
|
|
def get_source(self, fullname:str) -> str:
|
|
"""Abstract method which should return the source code for the
|
|
module."""
|
|
return NotImplementedError
|
|
|
|
InspectLoader.register(machinery.BuiltinImporter)
|
|
InspectLoader.register(machinery.FrozenImporter)
|
|
|
|
|
|
class PyLoader(_bootstrap.PyLoader, ResourceLoader, InspectLoader):
|
|
|
|
"""Abstract base class to assist in loading source code by requiring only
|
|
back-end storage methods to be implemented.
|
|
|
|
The methods get_code, get_source, and load_module are implemented for the
|
|
user.
|
|
|
|
"""
|
|
|
|
@abc.abstractmethod
|
|
def source_path(self, fullname:str) -> object:
|
|
"""Abstract method which when implemented should return the path to the
|
|
sourced code for the module."""
|
|
raise NotImplementedError
|
|
|
|
|
|
class PyPycLoader(_bootstrap.PyPycLoader, PyLoader):
|
|
|
|
"""Abstract base class to assist in loading source and bytecode by
|
|
requiring only back-end storage methods to be implemented.
|
|
|
|
The methods get_code, get_source, and load_module are implemented for the
|
|
user.
|
|
|
|
"""
|
|
|
|
@abc.abstractmethod
|
|
def source_mtime(self, fullname:str) -> int:
|
|
"""Abstract method which when implemented should return the
|
|
modification time for the source of the module."""
|
|
raise NotImplementedError
|
|
|
|
@abc.abstractmethod
|
|
def bytecode_path(self, fullname:str) -> object:
|
|
"""Abstract method which when implemented should return the path to the
|
|
bytecode for the module."""
|
|
raise NotImplementedError
|
|
|
|
@abc.abstractmethod
|
|
def write_bytecode(self, fullname:str, bytecode:bytes):
|
|
"""Abstract method which when implemented should attempt to write the
|
|
bytecode for the module."""
|
|
raise NotImplementedError
|