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.
This commit is contained in:
Brett Cannon 2012-02-16 17:47:48 -05:00
parent 7fab676e87
commit 3b1a06c1ea
3 changed files with 12 additions and 0 deletions

View File

@ -1048,6 +1048,8 @@ def __import__(name, globals={}, locals={}, fromlist=[], level=0):
raise TypeError("module name must be str, not {}".format(type(name))) raise TypeError("module name must be str, not {}".format(type(name)))
if level == 0: if level == 0:
module = _gcd_import(name) module = _gcd_import(name)
elif level < 0:
raise ValueError('level must be >= 0')
else: else:
package = _calc___package__(globals) package = _calc___package__(globals)
module = _gcd_import(name, package, level) module = _gcd_import(name, package, level)

View File

@ -12,6 +12,13 @@ class APITest(unittest.TestCase):
with self.assertRaises(TypeError): with self.assertRaises(TypeError):
util.import_(42) 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(): def test_main():
from test.support import run_unittest from test.support import run_unittest

View File

@ -466,6 +466,9 @@ Core and Builtins
Library 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 #2489: pty.spawn could consume 100% cpu when it encountered an EOF.
- Issue #13014: Fix a possible reference leak in SSLSocket.getpeercert(). - Issue #13014: Fix a possible reference leak in SSLSocket.getpeercert().