mirror of
https://github.com/python/cpython.git
synced 2025-08-22 01:35:16 +00:00
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.
This commit is contained in:
parent
4eaf7f9490
commit
41c56940c6
4 changed files with 1846 additions and 1784 deletions
|
@ -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)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue