diff options
author | Serhiy Storchaka <storchaka@gmail.com> | 2017-10-26 09:02:54 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-10-26 09:02:54 (GMT) |
commit | 2b5cbbb13c6c9138d04c3ca4eb7431f8c65d8e65 (patch) | |
tree | 24d62b53398b6cc121835eeb54fdbfeb62180fbb /Lib/test | |
parent | 614ea48986f80d361043510ac3945f3dcd666c31 (diff) | |
download | cpython-2b5cbbb13c6c9138d04c3ca4eb7431f8c65d8e65.zip cpython-2b5cbbb13c6c9138d04c3ca4eb7431f8c65d8e65.tar.gz cpython-2b5cbbb13c6c9138d04c3ca4eb7431f8c65d8e65.tar.bz2 |
[3.6] bpo-21720: Restore the Python 2.7 logic in handling a fromlist. (GH-4118) (#4128)
BytesWarning no longer emitted when the fromlist argument of
__import__() or the __all__ attribute of the module contain bytes
instances..
(cherry picked from commit 41c56940c6edf3ea169332a6b039b6c8796f0475)
Diffstat (limited to 'Lib/test')
-rw-r--r-- | Lib/test/test_importlib/import_/test_fromlist.py | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/Lib/test/test_importlib/import_/test_fromlist.py b/Lib/test/test_importlib/import_/test_fromlist.py index 1464003..018c172 100644 --- a/Lib/test/test_importlib/import_/test_fromlist.py +++ b/Lib/test/test_importlib/import_/test_fromlist.py @@ -1,5 +1,6 @@ """Test that the semantics relating to the 'fromlist' argument are correct.""" from .. import util +import warnings import unittest @@ -73,6 +74,13 @@ class HandlingFromlist: self.assertTrue(hasattr(module, 'module')) self.assertEqual(module.module.__name__, 'pkg.module') + def test_nonexistent_from_package(self): + with util.mock_modules('pkg.__init__') as importer: + with util.import_state(meta_path=[importer]): + module = self.__import__('pkg', fromlist=['non_existent']) + self.assertEqual(module.__name__, 'pkg') + self.assertFalse(hasattr(module, 'non_existent')) + def test_module_from_package_triggers_ModuleNotFoundError(self): # If a submodule causes an ModuleNotFoundError because it tries # to import a module which doesn't exist, that should let the @@ -122,6 +130,41 @@ class HandlingFromlist: self.assertEqual(module.module1.__name__, 'pkg.module1') self.assertEqual(module.module2.__name__, 'pkg.module2') + def test_nonexistent_in_all(self): + with util.mock_modules('pkg.__init__') as importer: + with util.import_state(meta_path=[importer]): + importer['pkg'].__all__ = ['non_existent'] + module = self.__import__('pkg', fromlist=['*']) + self.assertEqual(module.__name__, 'pkg') + self.assertFalse(hasattr(module, 'non_existent')) + + def test_star_in_all(self): + with util.mock_modules('pkg.__init__') as importer: + with util.import_state(meta_path=[importer]): + importer['pkg'].__all__ = ['*'] + module = self.__import__('pkg', fromlist=['*']) + self.assertEqual(module.__name__, 'pkg') + self.assertFalse(hasattr(module, '*')) + + def test_invalid_type(self): + with util.mock_modules('pkg.__init__') as importer: + with util.import_state(meta_path=[importer]), \ + warnings.catch_warnings(): + warnings.simplefilter('error', BytesWarning) + with self.assertRaisesRegex(TypeError, r'\bfrom\b'): + self.__import__('pkg', fromlist=[b'attr']) + with self.assertRaisesRegex(TypeError, r'\bfrom\b'): + self.__import__('pkg', fromlist=iter([b'attr'])) + + def test_invalid_type_in_all(self): + with util.mock_modules('pkg.__init__') as importer: + with util.import_state(meta_path=[importer]), \ + warnings.catch_warnings(): + warnings.simplefilter('error', BytesWarning) + importer['pkg'].__all__ = [b'attr'] + with self.assertRaisesRegex(TypeError, r'\bpkg\.__all__\b'): + self.__import__('pkg', fromlist=['*']) + (Frozen_FromList, Source_FromList |