Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 20 additions & 8 deletions Lib/importlib/resources.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@
import tempfile

from . import abc as resources_abc
from builtins import open as builtins_open
from contextlib import contextmanager, suppress
from importlib import import_module
from importlib.abc import ResourceLoader
Expand All @@ -15,6 +14,19 @@
from zipimport import ZipImportError


__all__ = [
'Package',
'Resource',
'contents',
'is_resource',
'open_binary',
'open_text',
'path',
'read_binary',
'read_text',
]


Package = Union[str, ModuleType]
Resource = Union[str, os.PathLike]

Expand Down Expand Up @@ -82,7 +94,7 @@ def open_binary(package: Package, resource: Resource) -> BinaryIO:
package_path = os.path.dirname(absolute_package_path)
full_path = os.path.join(package_path, resource)
try:
return builtins_open(full_path, mode='rb')
return open(full_path, mode='rb')
except OSError:
# Just assume the loader is a resource loader; all the relevant
# importlib.machinery loaders are and an AttributeError for
Expand Down Expand Up @@ -116,8 +128,7 @@ def open_text(package: Package,
package_path = os.path.dirname(absolute_package_path)
full_path = os.path.join(package_path, resource)
try:
return builtins_open(
full_path, mode='r', encoding=encoding, errors=errors)
return open(full_path, mode='r', encoding=encoding, errors=errors)
except OSError:
# Just assume the loader is a resource loader; all the relevant
# importlib.machinery loaders are and an AttributeError for
Expand Down Expand Up @@ -248,10 +259,10 @@ def contents(package: Package) -> Iterable[str]:
return os.listdir(package_directory)


# Private implementation of ResourceReader and get_resource_reader() for
# zipimport. Don't use these directly! We're implementing these in Python
# because 1) it's easier, 2) zipimport will likely get rewritten in Python
# itself at some point, so doing this all in C would just be a waste of
# Private implementation of ResourceReader and get_resource_reader() called
# from zipimport.c. Don't use these directly! We're implementing these in
# Python because 1) it's easier, 2) zipimport may get rewritten in Python
# itself at some point, so doing this all in C would difficult and a waste of
# effort.

class _ZipImportResourceReader(resources_abc.ResourceReader):
Expand Down Expand Up @@ -322,6 +333,7 @@ def contents(self):
yield parent_name


# Called from zipimport.c
def _zipimport_get_resource_reader(zipimporter, fullname):
try:
if not zipimporter.is_package(fullname):
Expand Down