]> granicus.if.org Git - python/commitdiff
Close #17702: os.environ now raises KeyError with the original environment
authorVictor Stinner <victor.stinner@gmail.com>
Sun, 14 Apr 2013 14:35:04 +0000 (16:35 +0200)
committerVictor Stinner <victor.stinner@gmail.com>
Sun, 14 Apr 2013 14:35:04 +0000 (16:35 +0200)
variable name (str on UNIX), instead of using the encoded name (bytes on UNIX).

Lib/os.py
Lib/test/test_os.py
Misc/NEWS

index e4ea1424b92c3569f072c52fd437b52c54ef8018..06616c64d8712bc4a0dcbf108aaae34d104e3f1d 100644 (file)
--- a/Lib/os.py
+++ b/Lib/os.py
@@ -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:
index 184c9ae31f70d77f094d42eaddab6c5acaef46d3..83373be96e64fe34746673c3fd139c9ce38ae9fd 100644 (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()."""
 
index c40ce846a9c3c5cd70d53fb1547eac34d2dfecdc..2ee78a968a21b8ff86880de277d9521446cbd668 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -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.