From 3b1a06c1eaec92242683b0a3460377e03cb6c214 Mon Sep 17 00:00:00 2001 From: Brett Cannon Date: Thu, 16 Feb 2012 17:47:48 -0500 Subject: [PATCH] importlib.__import__() now raises ValueError when level < 0. This is to bring it more in line with what PEP 328 set out to do with removing ambiguous absolute/relative import semantics. --- Lib/importlib/_bootstrap.py | 2 ++ Lib/importlib/test/import_/test_api.py | 7 +++++++ Misc/NEWS | 3 +++ 3 files changed, 12 insertions(+) diff --git a/Lib/importlib/_bootstrap.py b/Lib/importlib/_bootstrap.py index ad1561efb66..44349a8e128 100644 --- a/Lib/importlib/_bootstrap.py +++ b/Lib/importlib/_bootstrap.py @@ -1048,6 +1048,8 @@ def __import__(name, globals={}, locals={}, fromlist=[], level=0): raise TypeError("module name must be str, not {}".format(type(name))) if level == 0: module = _gcd_import(name) + elif level < 0: + raise ValueError('level must be >= 0') else: package = _calc___package__(globals) module = _gcd_import(name, package, level) diff --git a/Lib/importlib/test/import_/test_api.py b/Lib/importlib/test/import_/test_api.py index 9075d427597..2fa1f909547 100644 --- a/Lib/importlib/test/import_/test_api.py +++ b/Lib/importlib/test/import_/test_api.py @@ -12,6 +12,13 @@ def test_name_requires_rparition(self): with self.assertRaises(TypeError): util.import_(42) + def test_negative_level(self): + # Raise ValueError when a negative level is specified. + # PEP 328 did away with sys.module None entries and the ambiguity of + # absolute/relative imports. + with self.assertRaises(ValueError): + util.import_('os', globals(), level=-1) + def test_main(): from test.support import run_unittest diff --git a/Misc/NEWS b/Misc/NEWS index a1810aee71e..786417fd6ab 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -466,6 +466,9 @@ Core and Builtins Library ------- +- Do away with ambiguous level values (as suggested by PEP 328) in + importlib.__import__() by raising ValueError when level < 0. + - Issue #2489: pty.spawn could consume 100% cpu when it encountered an EOF. - Issue #13014: Fix a possible reference leak in SSLSocket.getpeercert().