diff --git a/Lib/os.py b/Lib/os.py index e293eca..5d28572 100644 --- a/Lib/os.py +++ b/Lib/os.py @@ -697,7 +697,8 @@ class _Environ(MutableMapping): raise KeyError(key) from None def __iter__(self): - for key in self._data: + data = dict(self._data) + for key in data: yield self.decodekey(key) def __len__(self): diff --git a/Lib/test/test_os.py b/Lib/test/test_os.py index 746b3f8..9cbe4b9 100644 --- a/Lib/test/test_os.py +++ b/Lib/test/test_os.py @@ -828,6 +828,21 @@ class EnvironTests(mapping_tests.BasicTestMappingProtocol): self.assertIs(cm.exception.args[0], missing) self.assertTrue(cm.exception.__suppress_context__) + def test_iter_error_when_os_environ_changes(self): + def _iter_environ_change(): + for key, value in os.environ.items(): + yield key, value + + iter_environ = _iter_environ_change() + key, value = next(iter_environ) # start iteration over os.environ + + # add a new key in os.environ mapping + new_key = "__{}".format(key) + os.environ[new_key] = value + + next(iter_environ) # force iteration over modified mapping + self.assertEqual(os.environ[new_key], value) + class WalkTests(unittest.TestCase): """Tests for os.walk()."""