Close #17702: os.environ now raises KeyError with the original environment

variable name (str on UNIX), instead of using the encoded name (bytes on UNIX).
This commit is contained in:
Victor Stinner 2013-04-14 16:35:04 +02:00
parent c4e0d982f3
commit 6d10139d70
3 changed files with 34 additions and 4 deletions

View File

@ -669,7 +669,11 @@ class _Environ(MutableMapping):
self._data = data
def __getitem__(self, key):
value = self._data[self.encodekey(key)]
try:
value = self._data[self.encodekey(key)]
except KeyError:
# raise KeyError with the original key value
raise KeyError(key)
return self.decodevalue(value)
def __setitem__(self, key, value):
@ -679,9 +683,13 @@ class _Environ(MutableMapping):
self._data[key] = value
def __delitem__(self, key):
key = self.encodekey(key)
self.unsetenv(key)
del self._data[key]
encodedkey = self.encodekey(key)
self.unsetenv(encodedkey)
try:
del self._data[encodedkey]
except KeyError:
# raise KeyError with the original key value
raise KeyError(key)
def __iter__(self):
for key in self._data:

View File

@ -632,6 +632,24 @@ class EnvironTests(mapping_tests.BasicTestMappingProtocol):
key = 'key='
self.assertRaises(OSError, os.environ.__delitem__, key)
def test_key_type(self):
missing = 'missingkey'
self.assertNotIn(missing, os.environ)
try:
os.environ[missing]
except KeyError as err:
self.assertIs(err.args[0], missing)
else:
self.fail("KeyError not raised")
try:
del os.environ[missing]
except KeyError as err:
self.assertIs(err.args[0], missing)
else:
self.fail("KeyError not raised")
class WalkTests(unittest.TestCase):
"""Tests for os.walk()."""

View File

@ -29,6 +29,10 @@ Core and Builtins
Library
-------
- Issue #17702: os.environ now raises KeyError with the original environment
variable name (str on UNIX), instead of using the encoded name (bytes on
UNIX).
- Issue #16163: Make the importlib based version of pkgutil.iter_importers
work for submodules. Initial patch by Berker Peksag.