summaryrefslogtreecommitdiffstats
path: root/Lib/importlib/_bootstrap.py
diff options
context:
space:
mode:
authorSerhiy Storchaka <storchaka@gmail.com>2017-10-26 07:41:59 (GMT)
committerGitHub <noreply@github.com>2017-10-26 07:41:59 (GMT)
commit41c56940c6edf3ea169332a6b039b6c8796f0475 (patch)
tree749eafdafa42c822e8251d045e7853daa148bf13 /Lib/importlib/_bootstrap.py
parent4eaf7f949069882e385f2297c9e70031caf9144c (diff)
downloadcpython-41c56940c6edf3ea169332a6b039b6c8796f0475.zip
cpython-41c56940c6edf3ea169332a6b039b6c8796f0475.tar.gz
cpython-41c56940c6edf3ea169332a6b039b6c8796f0475.tar.bz2
bpo-21720: Restore the Python 2.7 logic in handling a fromlist. (#4118)
BytesWarning no longer emitted when the fromlist argument of __import__() or the __all__ attribute of the module contain bytes instances.
Diffstat (limited to 'Lib/importlib/_bootstrap.py')
-rw-r--r--Lib/importlib/_bootstrap.py20
1 files changed, 13 insertions, 7 deletions
diff --git a/Lib/importlib/_bootstrap.py b/Lib/importlib/_bootstrap.py
index 76e1be5..5df6aa0 100644
--- a/Lib/importlib/_bootstrap.py
+++ b/Lib/importlib/_bootstrap.py
@@ -994,7 +994,7 @@ def _gcd_import(name, package=None, level=0):
return _find_and_load(name, _gcd_import)
-def _handle_fromlist(module, fromlist, import_):
+def _handle_fromlist(module, fromlist, import_, *, recursive=False):
"""Figure out what __import__ should return.
The import_ parameter is a callable which takes the name of module to
@@ -1005,13 +1005,19 @@ def _handle_fromlist(module, fromlist, import_):
# The hell that is fromlist ...
# If a package was imported, try to import stuff from fromlist.
if hasattr(module, '__path__'):
- if '*' in fromlist:
- fromlist = list(fromlist)
- fromlist.remove('*')
- if hasattr(module, '__all__'):
- fromlist.extend(module.__all__)
for x in fromlist:
- if not hasattr(module, x):
+ if not isinstance(x, str):
+ if recursive:
+ where = module.__name__ + '.__all__'
+ else:
+ where = "``from list''"
+ raise TypeError(f"Item in {where} must be str, "
+ f"not {type(x).__name__}")
+ elif x == '*':
+ if not recursive and hasattr(module, '__all__'):
+ _handle_fromlist(module, module.__all__, import_,
+ recursive=True)
+ elif not hasattr(module, x):
from_name = '{}.{}'.format(module.__name__, x)
try:
_call_with_frames_removed(import_, from_name)