mirror of https://github.com/python/cpython
386 lines
13 KiB
ReStructuredText
386 lines
13 KiB
ReStructuredText
|
.. class:: ResourceReader
|
||
|
|
||
|
*Superseded by TraversableResources*
|
||
|
|
||
|
An :term:`abstract base class` to provide the ability to read
|
||
|
*resources*.
|
||
|
|
||
|
From the perspective of this ABC, a *resource* is a binary
|
||
|
artifact that is shipped within a package. Typically this is
|
||
|
something like a data file that lives next to the ``__init__.py``
|
||
|
file of the package. The purpose of this class is to help abstract
|
||
|
out the accessing of such data files so that it does not matter if
|
||
|
the package and its data file(s) are stored in a e.g. zip file
|
||
|
versus on the file system.
|
||
|
|
||
|
For any of methods of this class, a *resource* argument is
|
||
|
expected to be a :term:`path-like object` which represents
|
||
|
conceptually just a file name. This means that no subdirectory
|
||
|
paths should be included in the *resource* argument. This is
|
||
|
because the location of the package the reader is for, acts as the
|
||
|
"directory". Hence the metaphor for directories and file
|
||
|
names is packages and resources, respectively. This is also why
|
||
|
instances of this class are expected to directly correlate to
|
||
|
a specific package (instead of potentially representing multiple
|
||
|
packages or a module).
|
||
|
|
||
|
Loaders that wish to support resource reading are expected to
|
||
|
provide a method called ``get_resource_reader(fullname)`` which
|
||
|
returns an object implementing this ABC's interface. If the module
|
||
|
specified by fullname is not a package, this method should return
|
||
|
:const:`None`. An object compatible with this ABC should only be
|
||
|
returned when the specified module is a package.
|
||
|
|
||
|
.. versionadded:: 3.7
|
||
|
|
||
|
.. abstractmethod:: open_resource(resource)
|
||
|
|
||
|
Returns an opened, :term:`file-like object` for binary reading
|
||
|
of the *resource*.
|
||
|
|
||
|
If the resource cannot be found, :exc:`FileNotFoundError` is
|
||
|
raised.
|
||
|
|
||
|
.. abstractmethod:: resource_path(resource)
|
||
|
|
||
|
Returns the file system path to the *resource*.
|
||
|
|
||
|
If the resource does not concretely exist on the file system,
|
||
|
raise :exc:`FileNotFoundError`.
|
||
|
|
||
|
.. abstractmethod:: is_resource(name)
|
||
|
|
||
|
Returns ``True`` if the named *name* is considered a resource.
|
||
|
:exc:`FileNotFoundError` is raised if *name* does not exist.
|
||
|
|
||
|
.. abstractmethod:: contents()
|
||
|
|
||
|
Returns an :term:`iterable` of strings over the contents of
|
||
|
the package. Do note that it is not required that all names
|
||
|
returned by the iterator be actual resources, e.g. it is
|
||
|
acceptable to return names for which :meth:`is_resource` would
|
||
|
be false.
|
||
|
|
||
|
Allowing non-resource names to be returned is to allow for
|
||
|
situations where how a package and its resources are stored
|
||
|
are known a priori and the non-resource names would be useful.
|
||
|
For instance, returning subdirectory names is allowed so that
|
||
|
when it is known that the package and resources are stored on
|
||
|
the file system then those subdirectory names can be used
|
||
|
directly.
|
||
|
|
||
|
The abstract method returns an iterable of no items.
|
||
|
|
||
|
|
||
|
.. class:: ResourceLoader
|
||
|
|
||
|
An abstract base class for a :term:`loader` which implements the optional
|
||
|
:pep:`302` protocol for loading arbitrary resources from the storage
|
||
|
back-end.
|
||
|
|
||
|
.. deprecated:: 3.7
|
||
|
This ABC is deprecated in favour of supporting resource loading
|
||
|
through :class:`importlib.abc.ResourceReader`.
|
||
|
|
||
|
.. abstractmethod:: get_data(path)
|
||
|
|
||
|
An abstract method to return the bytes for the data located at *path*.
|
||
|
Loaders that have a file-like storage back-end
|
||
|
that allows storing arbitrary data
|
||
|
can implement this abstract method to give direct access
|
||
|
to the data stored. :exc:`OSError` is to be raised if the *path* cannot
|
||
|
be found. The *path* is expected to be constructed using a module's
|
||
|
:attr:`__file__` attribute or an item from a package's :attr:`__path__`.
|
||
|
|
||
|
.. versionchanged:: 3.4
|
||
|
Raises :exc:`OSError` instead of :exc:`NotImplementedError`.
|
||
|
|
||
|
|
||
|
.. class:: InspectLoader
|
||
|
|
||
|
An abstract base class for a :term:`loader` which implements the optional
|
||
|
:pep:`302` protocol for loaders that inspect modules.
|
||
|
|
||
|
.. method:: get_code(fullname)
|
||
|
|
||
|
Return the code object for a module, or ``None`` if the module does not
|
||
|
have a code object (as would be the case, for example, for a built-in
|
||
|
module). Raise an :exc:`ImportError` if loader cannot find the
|
||
|
requested module.
|
||
|
|
||
|
.. note::
|
||
|
While the method has a default implementation, it is suggested that
|
||
|
it be overridden if possible for performance.
|
||
|
|
||
|
.. index::
|
||
|
single: universal newlines; importlib.abc.InspectLoader.get_source method
|
||
|
|
||
|
.. versionchanged:: 3.4
|
||
|
No longer abstract and a concrete implementation is provided.
|
||
|
|
||
|
.. abstractmethod:: get_source(fullname)
|
||
|
|
||
|
An abstract method to return the source of a module. It is returned as
|
||
|
a text string using :term:`universal newlines`, translating all
|
||
|
recognized line separators into ``'\n'`` characters. Returns ``None``
|
||
|
if no source is available (e.g. a built-in module). Raises
|
||
|
:exc:`ImportError` if the loader cannot find the module specified.
|
||
|
|
||
|
.. versionchanged:: 3.4
|
||
|
Raises :exc:`ImportError` instead of :exc:`NotImplementedError`.
|
||
|
|
||
|
.. method:: is_package(fullname)
|
||
|
|
||
|
An optional method to return a true value if the module is a package, a
|
||
|
false value otherwise. :exc:`ImportError` is raised if the
|
||
|
:term:`loader` cannot find the module.
|
||
|
|
||
|
.. versionchanged:: 3.4
|
||
|
Raises :exc:`ImportError` instead of :exc:`NotImplementedError`.
|
||
|
|
||
|
.. staticmethod:: source_to_code(data, path='<string>')
|
||
|
|
||
|
Create a code object from Python source.
|
||
|
|
||
|
The *data* argument can be whatever the :func:`compile` function
|
||
|
supports (i.e. string or bytes). The *path* argument should be
|
||
|
the "path" to where the source code originated from, which can be an
|
||
|
abstract concept (e.g. location in a zip file).
|
||
|
|
||
|
With the subsequent code object one can execute it in a module by
|
||
|
running ``exec(code, module.__dict__)``.
|
||
|
|
||
|
.. versionadded:: 3.4
|
||
|
|
||
|
.. versionchanged:: 3.5
|
||
|
Made the method static.
|
||
|
|
||
|
.. method:: exec_module(module)
|
||
|
|
||
|
Implementation of :meth:`Loader.exec_module`.
|
||
|
|
||
|
.. versionadded:: 3.4
|
||
|
|
||
|
.. method:: load_module(fullname)
|
||
|
|
||
|
Implementation of :meth:`Loader.load_module`.
|
||
|
|
||
|
.. deprecated:: 3.4
|
||
|
use :meth:`exec_module` instead.
|
||
|
|
||
|
|
||
|
.. class:: ExecutionLoader
|
||
|
|
||
|
An abstract base class which inherits from :class:`InspectLoader` that,
|
||
|
when implemented, helps a module to be executed as a script. The ABC
|
||
|
represents an optional :pep:`302` protocol.
|
||
|
|
||
|
.. abstractmethod:: get_filename(fullname)
|
||
|
|
||
|
An abstract method that is to return the value of :attr:`__file__` for
|
||
|
the specified module. If no path is available, :exc:`ImportError` is
|
||
|
raised.
|
||
|
|
||
|
If source code is available, then the method should return the path to
|
||
|
the source file, regardless of whether a bytecode was used to load the
|
||
|
module.
|
||
|
|
||
|
.. versionchanged:: 3.4
|
||
|
Raises :exc:`ImportError` instead of :exc:`NotImplementedError`.
|
||
|
|
||
|
|
||
|
.. class:: FileLoader(fullname, path)
|
||
|
|
||
|
An abstract base class which inherits from :class:`ResourceLoader` and
|
||
|
:class:`ExecutionLoader`, providing concrete implementations of
|
||
|
:meth:`ResourceLoader.get_data` and :meth:`ExecutionLoader.get_filename`.
|
||
|
|
||
|
The *fullname* argument is a fully resolved name of the module the loader is
|
||
|
to handle. The *path* argument is the path to the file for the module.
|
||
|
|
||
|
.. versionadded:: 3.3
|
||
|
|
||
|
.. attribute:: name
|
||
|
|
||
|
The name of the module the loader can handle.
|
||
|
|
||
|
.. attribute:: path
|
||
|
|
||
|
Path to the file of the module.
|
||
|
|
||
|
.. method:: load_module(fullname)
|
||
|
|
||
|
Calls super's ``load_module()``.
|
||
|
|
||
|
.. deprecated:: 3.4
|
||
|
Use :meth:`Loader.exec_module` instead.
|
||
|
|
||
|
.. abstractmethod:: get_filename(fullname)
|
||
|
|
||
|
Returns :attr:`path`.
|
||
|
|
||
|
.. abstractmethod:: get_data(path)
|
||
|
|
||
|
Reads *path* as a binary file and returns the bytes from it.
|
||
|
|
||
|
|
||
|
.. class:: SourceLoader
|
||
|
|
||
|
An abstract base class for implementing source (and optionally bytecode)
|
||
|
file loading. The class inherits from both :class:`ResourceLoader` and
|
||
|
:class:`ExecutionLoader`, requiring the implementation of:
|
||
|
|
||
|
* :meth:`ResourceLoader.get_data`
|
||
|
* :meth:`ExecutionLoader.get_filename`
|
||
|
Should only return the path to the source file; sourceless
|
||
|
loading is not supported.
|
||
|
|
||
|
The abstract methods defined by this class are to add optional bytecode
|
||
|
file support. Not implementing these optional methods (or causing them to
|
||
|
raise :exc:`NotImplementedError`) causes the loader to
|
||
|
only work with source code. Implementing the methods allows the loader to
|
||
|
work with source *and* bytecode files; it does not allow for *sourceless*
|
||
|
loading where only bytecode is provided. Bytecode files are an
|
||
|
optimization to speed up loading by removing the parsing step of Python's
|
||
|
compiler, and so no bytecode-specific API is exposed.
|
||
|
|
||
|
.. method:: path_stats(path)
|
||
|
|
||
|
Optional abstract method which returns a :class:`dict` containing
|
||
|
metadata about the specified path. Supported dictionary keys are:
|
||
|
|
||
|
- ``'mtime'`` (mandatory): an integer or floating-point number
|
||
|
representing the modification time of the source code;
|
||
|
- ``'size'`` (optional): the size in bytes of the source code.
|
||
|
|
||
|
Any other keys in the dictionary are ignored, to allow for future
|
||
|
extensions. If the path cannot be handled, :exc:`OSError` is raised.
|
||
|
|
||
|
.. versionadded:: 3.3
|
||
|
|
||
|
.. versionchanged:: 3.4
|
||
|
Raise :exc:`OSError` instead of :exc:`NotImplementedError`.
|
||
|
|
||
|
.. method:: path_mtime(path)
|
||
|
|
||
|
Optional abstract method which returns the modification time for the
|
||
|
specified path.
|
||
|
|
||
|
.. deprecated:: 3.3
|
||
|
This method is deprecated in favour of :meth:`path_stats`. You don't
|
||
|
have to implement it, but it is still available for compatibility
|
||
|
purposes. Raise :exc:`OSError` if the path cannot be handled.
|
||
|
|
||
|
.. versionchanged:: 3.4
|
||
|
Raise :exc:`OSError` instead of :exc:`NotImplementedError`.
|
||
|
|
||
|
.. method:: set_data(path, data)
|
||
|
|
||
|
Optional abstract method which writes the specified bytes to a file
|
||
|
path. Any intermediate directories which do not exist are to be created
|
||
|
automatically.
|
||
|
|
||
|
When writing to the path fails because the path is read-only
|
||
|
(:attr:`errno.EACCES`/:exc:`PermissionError`), do not propagate the
|
||
|
exception.
|
||
|
|
||
|
.. versionchanged:: 3.4
|
||
|
No longer raises :exc:`NotImplementedError` when called.
|
||
|
|
||
|
.. method:: get_code(fullname)
|
||
|
|
||
|
Concrete implementation of :meth:`InspectLoader.get_code`.
|
||
|
|
||
|
.. method:: exec_module(module)
|
||
|
|
||
|
Concrete implementation of :meth:`Loader.exec_module`.
|
||
|
|
||
|
.. versionadded:: 3.4
|
||
|
|
||
|
.. method:: load_module(fullname)
|
||
|
|
||
|
Concrete implementation of :meth:`Loader.load_module`.
|
||
|
|
||
|
.. deprecated:: 3.4
|
||
|
Use :meth:`exec_module` instead.
|
||
|
|
||
|
.. method:: get_source(fullname)
|
||
|
|
||
|
Concrete implementation of :meth:`InspectLoader.get_source`.
|
||
|
|
||
|
.. method:: is_package(fullname)
|
||
|
|
||
|
Concrete implementation of :meth:`InspectLoader.is_package`. A module
|
||
|
is determined to be a package if its file path (as provided by
|
||
|
:meth:`ExecutionLoader.get_filename`) is a file named
|
||
|
``__init__`` when the file extension is removed **and** the module name
|
||
|
itself does not end in ``__init__``.
|
||
|
|
||
|
|
||
|
.. class:: Traversable
|
||
|
|
||
|
An object with a subset of pathlib.Path methods suitable for
|
||
|
traversing directories and opening files.
|
||
|
|
||
|
.. versionadded:: 3.9
|
||
|
|
||
|
.. attribute:: name
|
||
|
|
||
|
Abstract. The base name of this object without any parent references.
|
||
|
|
||
|
.. abstractmethod:: iterdir()
|
||
|
|
||
|
Yield Traversable objects in self.
|
||
|
|
||
|
.. abstractmethod:: is_dir()
|
||
|
|
||
|
Return True if self is a directory.
|
||
|
|
||
|
.. abstractmethod:: is_file()
|
||
|
|
||
|
Return True if self is a file.
|
||
|
|
||
|
.. abstractmethod:: joinpath(child)
|
||
|
|
||
|
Return Traversable child in self.
|
||
|
|
||
|
.. abstractmethod:: __truediv__(child)
|
||
|
|
||
|
Return Traversable child in self.
|
||
|
|
||
|
.. abstractmethod:: open(mode='r', *args, **kwargs)
|
||
|
|
||
|
*mode* may be 'r' or 'rb' to open as text or binary. Return a handle
|
||
|
suitable for reading (same as :attr:`pathlib.Path.open`).
|
||
|
|
||
|
When opening as text, accepts encoding parameters such as those
|
||
|
accepted by :attr:`io.TextIOWrapper`.
|
||
|
|
||
|
.. method:: read_bytes()
|
||
|
|
||
|
Read contents of self as bytes.
|
||
|
|
||
|
.. method:: read_text(encoding=None)
|
||
|
|
||
|
Read contents of self as text.
|
||
|
|
||
|
|
||
|
.. class:: TraversableResources
|
||
|
|
||
|
An abstract base class for resource readers capable of serving
|
||
|
the :meth:`importlib.resources.files` interface. Subclasses
|
||
|
:class:`importlib.abc.ResourceReader` and provides
|
||
|
concrete implementations of the :class:`importlib.abc.ResourceReader`'s
|
||
|
abstract methods. Therefore, any loader supplying
|
||
|
:class:`importlib.abc.TraversableReader` also supplies ResourceReader.
|
||
|
|
||
|
Loaders that wish to support resource reading are expected to
|
||
|
implement this interface.
|
||
|
|
||
|
.. versionadded:: 3.9
|
||
|
|
||
|
.. abstractmethod:: files()
|
||
|
|
||
|
Returns a :class:`importlib.abc.Traversable` object for the loaded
|
||
|
package.
|