From d3da72465701b7e9d9d9bbd54fa6b3d12fbf6595 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Thu, 20 Jun 2024 11:09:34 +0200 Subject: [PATCH] Revert "gh-120057: Add os.environ.refresh() method (#120059)" This reverts commit 7aff2de62bc28eb23888270b698c6b6915f69b21. The function is controversial and it was decided to remove it. --- Doc/library/os.rst | 11 ----- Doc/whatsnew/3.14.rst | 7 --- Lib/os.py | 25 ++-------- Lib/test/test_os.py | 46 ------------------- ...-06-04-18-53-10.gh-issue-120057.RSD9_Z.rst | 4 -- Modules/clinic/posixmodule.c.h | 20 +------- Modules/posixmodule.c | 15 ------ 7 files changed, 4 insertions(+), 124 deletions(-) delete mode 100644 Misc/NEWS.d/next/Library/2024-06-04-18-53-10.gh-issue-120057.RSD9_Z.rst diff --git a/Doc/library/os.rst b/Doc/library/os.rst index 360d71e70960c7..b93b06d4e72afc 100644 --- a/Doc/library/os.rst +++ b/Doc/library/os.rst @@ -193,10 +193,6 @@ process and user. to the environment made after this time are not reflected in :data:`os.environ`, except for changes made by modifying :data:`os.environ` directly. - The :meth:`!os.environ.refresh()` method updates :data:`os.environ` with - changes to the environment made by :func:`os.putenv`, by - :func:`os.unsetenv`, or made outside Python in the same process. - This mapping may be used to modify the environment as well as query the environment. :func:`putenv` will be called automatically when the mapping is modified. @@ -229,9 +225,6 @@ process and user. .. versionchanged:: 3.9 Updated to support :pep:`584`'s merge (``|``) and update (``|=``) operators. - .. versionchanged:: 3.14 - Added the :meth:`!os.environ.refresh()` method. - .. data:: environb @@ -568,8 +561,6 @@ process and user. of :data:`os.environ`. This also applies to :func:`getenv` and :func:`getenvb`, which respectively use :data:`os.environ` and :data:`os.environb` in their implementations. - See also the :data:`os.environ.refresh() ` method. - .. note:: On some platforms, including FreeBSD and macOS, setting ``environ`` may @@ -818,8 +809,6 @@ process and user. don't update :data:`os.environ`, so it is actually preferable to delete items of :data:`os.environ`. - See also the :data:`os.environ.refresh() ` method. - .. audit-event:: os.unsetenv key os.unsetenv .. versionchanged:: 3.9 diff --git a/Doc/whatsnew/3.14.rst b/Doc/whatsnew/3.14.rst index 804d39ab64646d..8feaa6607f93d0 100644 --- a/Doc/whatsnew/3.14.rst +++ b/Doc/whatsnew/3.14.rst @@ -92,13 +92,6 @@ ast Added :func:`ast.compare` for comparing two ASTs. (Contributed by Batuhan Taskaya and Jeremy Hylton in :issue:`15987`.) -os --- - -* Added the :data:`os.environ.refresh() ` method to update - :data:`os.environ` with changes to the environment made by :func:`os.putenv`, - by :func:`os.unsetenv`, or made outside Python in the same process. - (Contributed by Victor Stinner in :gh:`120057`.) pathlib ------- diff --git a/Lib/os.py b/Lib/os.py index 4b48afb040e565..0408e2db79e66e 100644 --- a/Lib/os.py +++ b/Lib/os.py @@ -64,10 +64,6 @@ def _get_exports_list(module): from posix import _have_functions except ImportError: pass - try: - from posix import _create_environ - except ImportError: - pass import posix __all__.extend(_get_exports_list(posix)) @@ -92,10 +88,6 @@ def _get_exports_list(module): from nt import _have_functions except ImportError: pass - try: - from nt import _create_environ - except ImportError: - pass else: raise ImportError('no os specific module found') @@ -781,18 +773,7 @@ def __ror__(self, other): new.update(self) return new - if _exists("_create_environ"): - def refresh(self): - data = _create_environ() - if name == 'nt': - data = {self.encodekey(key): value - for key, value in data.items()} - - # modify in-place to keep os.environb in sync - self._data.clear() - self._data.update(data) - -def _create_environ_mapping(): +def _createenviron(): if name == 'nt': # Where Env Var Names Must Be UPPERCASE def check_str(value): @@ -822,8 +803,8 @@ def decode(value): encode, decode) # unicode environ -environ = _create_environ_mapping() -del _create_environ_mapping +environ = _createenviron() +del _createenviron def getenv(key, default=None): diff --git a/Lib/test/test_os.py b/Lib/test/test_os.py index f93937fb587386..2beb9ca8aa6ccb 100644 --- a/Lib/test/test_os.py +++ b/Lib/test/test_os.py @@ -1298,52 +1298,6 @@ def test_ror_operator(self): self._test_underlying_process_env('_A_', '') self._test_underlying_process_env(overridden_key, original_value) - def test_refresh(self): - # Test os.environ.refresh() - has_environb = hasattr(os, 'environb') - - # Test with putenv() which doesn't update os.environ - os.environ['test_env'] = 'python_value' - os.putenv("test_env", "new_value") - self.assertEqual(os.environ['test_env'], 'python_value') - if has_environb: - self.assertEqual(os.environb[b'test_env'], b'python_value') - - os.environ.refresh() - self.assertEqual(os.environ['test_env'], 'new_value') - if has_environb: - self.assertEqual(os.environb[b'test_env'], b'new_value') - - # Test with unsetenv() which doesn't update os.environ - os.unsetenv('test_env') - self.assertEqual(os.environ['test_env'], 'new_value') - if has_environb: - self.assertEqual(os.environb[b'test_env'], b'new_value') - - os.environ.refresh() - self.assertNotIn('test_env', os.environ) - if has_environb: - self.assertNotIn(b'test_env', os.environb) - - if has_environb: - # test os.environb.refresh() with putenv() - os.environb[b'test_env'] = b'python_value2' - os.putenv("test_env", "new_value2") - self.assertEqual(os.environb[b'test_env'], b'python_value2') - self.assertEqual(os.environ['test_env'], 'python_value2') - - os.environb.refresh() - self.assertEqual(os.environb[b'test_env'], b'new_value2') - self.assertEqual(os.environ['test_env'], 'new_value2') - - # test os.environb.refresh() with unsetenv() - os.unsetenv('test_env') - self.assertEqual(os.environb[b'test_env'], b'new_value2') - self.assertEqual(os.environ['test_env'], 'new_value2') - - os.environb.refresh() - self.assertNotIn(b'test_env', os.environb) - self.assertNotIn('test_env', os.environ) class WalkTests(unittest.TestCase): """Tests for os.walk().""" diff --git a/Misc/NEWS.d/next/Library/2024-06-04-18-53-10.gh-issue-120057.RSD9_Z.rst b/Misc/NEWS.d/next/Library/2024-06-04-18-53-10.gh-issue-120057.RSD9_Z.rst deleted file mode 100644 index 955be59821ee0c..00000000000000 --- a/Misc/NEWS.d/next/Library/2024-06-04-18-53-10.gh-issue-120057.RSD9_Z.rst +++ /dev/null @@ -1,4 +0,0 @@ -Added the :data:`os.environ.refresh() ` method to update -:data:`os.environ` with changes to the environment made by :func:`os.putenv`, -by :func:`os.unsetenv`, or made outside Python in the same process. -Patch by Victor Stinner. diff --git a/Modules/clinic/posixmodule.c.h b/Modules/clinic/posixmodule.c.h index 07b28fef3a57ea..69fc178331c09c 100644 --- a/Modules/clinic/posixmodule.c.h +++ b/Modules/clinic/posixmodule.c.h @@ -12152,24 +12152,6 @@ os__is_inputhook_installed(PyObject *module, PyObject *Py_UNUSED(ignored)) return os__is_inputhook_installed_impl(module); } -PyDoc_STRVAR(os__create_environ__doc__, -"_create_environ($module, /)\n" -"--\n" -"\n" -"Create the environment dictionary."); - -#define OS__CREATE_ENVIRON_METHODDEF \ - {"_create_environ", (PyCFunction)os__create_environ, METH_NOARGS, os__create_environ__doc__}, - -static PyObject * -os__create_environ_impl(PyObject *module); - -static PyObject * -os__create_environ(PyObject *module, PyObject *Py_UNUSED(ignored)) -{ - return os__create_environ_impl(module); -} - #ifndef OS_TTYNAME_METHODDEF #define OS_TTYNAME_METHODDEF #endif /* !defined(OS_TTYNAME_METHODDEF) */ @@ -12837,4 +12819,4 @@ os__create_environ(PyObject *module, PyObject *Py_UNUSED(ignored)) #ifndef OS__SUPPORTS_VIRTUAL_TERMINAL_METHODDEF #define OS__SUPPORTS_VIRTUAL_TERMINAL_METHODDEF #endif /* !defined(OS__SUPPORTS_VIRTUAL_TERMINAL_METHODDEF) */ -/*[clinic end generated code: output=5ae2e5ffcd9c8a84 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=faaa5e5ffb7b165d input=a9049054013a1b77]*/ diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index fc218383d5ff95..f85fab31096395 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -16811,20 +16811,6 @@ os__is_inputhook_installed_impl(PyObject *module) return PyBool_FromLong(PyOS_InputHook != NULL); } -/*[clinic input] -os._create_environ - -Create the environment dictionary. -[clinic start generated code]*/ - -static PyObject * -os__create_environ_impl(PyObject *module) -/*[clinic end generated code: output=19d9039ab14f8ad4 input=a4c05686b34635e8]*/ -{ - return convertenviron(); -} - - static PyMethodDef posix_methods[] = { OS_STAT_METHODDEF @@ -17039,7 +17025,6 @@ static PyMethodDef posix_methods[] = { OS__SUPPORTS_VIRTUAL_TERMINAL_METHODDEF OS__INPUTHOOK_METHODDEF OS__IS_INPUTHOOK_INSTALLED_METHODDEF - OS__CREATE_ENVIRON_METHODDEF {NULL, NULL} /* Sentinel */ };