From 6afbaef2fd439e9c6a9269f07309f8bb91255fd3 Mon Sep 17 00:00:00 2001 From: Brett Cannon Date: Sun, 30 Aug 2009 19:08:58 +0000 Subject: Raise TypeError if the name given to importlib.__import__() lacks an rpartition attribute. Was throwing AttributeError before. Discovered when running test_builtin against importlib. This exception change is specific to importlib.__import__() and does not apply to import_module() as it is being done for compatibility reasons only. --- Lib/importlib/_bootstrap.py | 2 ++ Lib/importlib/test/import_/test_api.py | 22 ++++++++++++++++++++++ Lib/importlib/test/regrtest.py | 1 - Misc/NEWS | 4 ++++ 4 files changed, 28 insertions(+), 1 deletion(-) create mode 100644 Lib/importlib/test/import_/test_api.py diff --git a/Lib/importlib/_bootstrap.py b/Lib/importlib/_bootstrap.py index 95fea33..063f603 100644 --- a/Lib/importlib/_bootstrap.py +++ b/Lib/importlib/_bootstrap.py @@ -917,6 +917,8 @@ def __import__(name, globals={}, locals={}, fromlist=[], level=0): import (e.g. ``from ..pkg import mod`` would have a 'level' of 2). """ + if not hasattr(name, 'rpartition'): + raise TypeError("module name must be str, not {}".format(type(name))) if level == 0: module = _gcd_import(name) else: diff --git a/Lib/importlib/test/import_/test_api.py b/Lib/importlib/test/import_/test_api.py new file mode 100644 index 0000000..9075d42 --- /dev/null +++ b/Lib/importlib/test/import_/test_api.py @@ -0,0 +1,22 @@ +from . import util +import unittest + + +class APITest(unittest.TestCase): + + """Test API-specific details for __import__ (e.g. raising the right + exception when passing in an int for the module name).""" + + def test_name_requires_rparition(self): + # Raise TypeError if a non-string is passed in for the module name. + with self.assertRaises(TypeError): + util.import_(42) + + +def test_main(): + from test.support import run_unittest + run_unittest(APITest) + + +if __name__ == '__main__': + test_main() diff --git a/Lib/importlib/test/regrtest.py b/Lib/importlib/test/regrtest.py index 17e7f4e..aedc338 100644 --- a/Lib/importlib/test/regrtest.py +++ b/Lib/importlib/test/regrtest.py @@ -6,7 +6,6 @@ Otherwise all command-line options valid for test.regrtest are also valid for this script. XXX FAILING - test_builtin # Wanting a TypeError for an integer name test_import # execution bit, exception name differing, file name differing between code and module (?) test_importhooks # package not set in _gcd_import() but level > 0 diff --git a/Misc/NEWS b/Misc/NEWS index d6d7dc3..6f73e73 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -68,6 +68,10 @@ C-API Library ------- +- Raise a TypeError when the name of a module to be imported for + importlib.__import__ is not a string (was raising an + AttributeError before). + - Allow the fromlist passed into importlib.__import__ to be any iterable. - Have importlib raise ImportError if None is found in sys.modules. -- cgit v0.12