Skip to content

Commit 0ff626f

Browse files
authored
gh-77782: Deprecate global configuration variable (#93943)
Deprecate global configuration variable like Py_IgnoreEnvironmentFlag: the Py_InitializeFromConfig() API should be instead. Fix declaration of Py_GETENV(): use PyAPI_FUNC(), not PyAPI_DATA().
1 parent f64557f commit 0ff626f

File tree

8 files changed

+96
-28
lines changed

8 files changed

+96
-28
lines changed

Doc/whatsnew/3.12.rst

+29
Original file line numberDiff line numberDiff line change
@@ -257,6 +257,35 @@ Porting to Python 3.12
257257
Deprecated
258258
----------
259259

260+
* Deprecate global configuration variable:
261+
262+
* :c:var:`Py_DebugFlag`: use :c:member:`PyConfig.parser_debug`
263+
* :c:var:`Py_VerboseFlag`: use :c:member:`PyConfig.verbose`
264+
* :c:var:`Py_QuietFlag`: use :c:member:`PyConfig.quiet`
265+
* :c:var:`Py_InteractiveFlag`: use :c:member:`PyConfig.interactive`
266+
* :c:var:`Py_InspectFlag`: use :c:member:`PyConfig.inspect`
267+
* :c:var:`Py_OptimizeFlag`: use :c:member:`PyConfig.optimization_level`
268+
* :c:var:`Py_NoSiteFlag`: use :c:member:`PyConfig.site_import`
269+
* :c:var:`Py_BytesWarningFlag`: use :c:member:`PyConfig.bytes_warning`
270+
* :c:var:`Py_FrozenFlag`: use :c:member:`PyConfig.pathconfig_warnings`
271+
* :c:var:`Py_IgnoreEnvironmentFlag`: use :c:member:`PyConfig.use_environment`
272+
* :c:var:`Py_DontWriteBytecodeFlag`: use :c:member:`PyConfig.write_bytecode`
273+
* :c:var:`Py_NoUserSiteDirectory`: use :c:member:`PyConfig.user_site_directory`
274+
* :c:var:`Py_UnbufferedStdioFlag`: use :c:member:`PyConfig.buffered_stdio`
275+
* :c:var:`Py_HashRandomizationFlag`: use :c:member:`PyConfig.use_hash_seed`
276+
and :c:member:`PyConfig.hash_seed`
277+
* :c:var:`Py_IsolatedFlag`: use :c:member:`PyConfig.isolated`
278+
* :c:var:`Py_LegacyWindowsFSEncodingFlag`: use :c:member:`PyConfig.legacy_windows_fs_encoding`
279+
* :c:var:`Py_LegacyWindowsStdioFlag`: use :c:member:`PyConfig.legacy_windows_stdio`
280+
* :c:var:`Py_FileSystemDefaultEncoding`: use :c:member:`PyConfig.filesystem_encoding`
281+
* :c:var:`Py_FileSystemDefaultEncodeErrors`: use :c:member:`PyConfig.filesystem_errors`
282+
* :c:var:`Py_UTF8Mode`: use :c:member:`PyPreConfig.utf8_mode` (see :c:func:`Py_PreInitialize`)
283+
284+
The :c:func:`Py_InitializeFromConfig` API should be used with
285+
:c:type:`PyConfig` instead.
286+
(Contributed by Victor Stinner in :gh:`77782`.)
287+
288+
260289
Removed
261290
-------
262291

Include/cpython/pydebug.h

+18-18
Original file line numberDiff line numberDiff line change
@@ -5,31 +5,31 @@
55
extern "C" {
66
#endif
77

8-
PyAPI_DATA(int) Py_DebugFlag;
9-
PyAPI_DATA(int) Py_VerboseFlag;
10-
PyAPI_DATA(int) Py_QuietFlag;
11-
PyAPI_DATA(int) Py_InteractiveFlag;
12-
PyAPI_DATA(int) Py_InspectFlag;
13-
PyAPI_DATA(int) Py_OptimizeFlag;
14-
PyAPI_DATA(int) Py_NoSiteFlag;
15-
PyAPI_DATA(int) Py_BytesWarningFlag;
16-
PyAPI_DATA(int) Py_FrozenFlag;
17-
PyAPI_DATA(int) Py_IgnoreEnvironmentFlag;
18-
PyAPI_DATA(int) Py_DontWriteBytecodeFlag;
19-
PyAPI_DATA(int) Py_NoUserSiteDirectory;
20-
PyAPI_DATA(int) Py_UnbufferedStdioFlag;
21-
PyAPI_DATA(int) Py_HashRandomizationFlag;
22-
PyAPI_DATA(int) Py_IsolatedFlag;
8+
Py_DEPRECATED(3.12) PyAPI_DATA(int) Py_DebugFlag;
9+
Py_DEPRECATED(3.12) PyAPI_DATA(int) Py_VerboseFlag;
10+
Py_DEPRECATED(3.12) PyAPI_DATA(int) Py_QuietFlag;
11+
Py_DEPRECATED(3.12) PyAPI_DATA(int) Py_InteractiveFlag;
12+
Py_DEPRECATED(3.12) PyAPI_DATA(int) Py_InspectFlag;
13+
Py_DEPRECATED(3.12) PyAPI_DATA(int) Py_OptimizeFlag;
14+
Py_DEPRECATED(3.12) PyAPI_DATA(int) Py_NoSiteFlag;
15+
Py_DEPRECATED(3.12) PyAPI_DATA(int) Py_BytesWarningFlag;
16+
Py_DEPRECATED(3.12) PyAPI_DATA(int) Py_FrozenFlag;
17+
Py_DEPRECATED(3.12) PyAPI_DATA(int) Py_IgnoreEnvironmentFlag;
18+
Py_DEPRECATED(3.12) PyAPI_DATA(int) Py_DontWriteBytecodeFlag;
19+
Py_DEPRECATED(3.12) PyAPI_DATA(int) Py_NoUserSiteDirectory;
20+
Py_DEPRECATED(3.12) PyAPI_DATA(int) Py_UnbufferedStdioFlag;
21+
Py_DEPRECATED(3.12) PyAPI_DATA(int) Py_HashRandomizationFlag;
22+
Py_DEPRECATED(3.12) PyAPI_DATA(int) Py_IsolatedFlag;
2323

2424
#ifdef MS_WINDOWS
25-
PyAPI_DATA(int) Py_LegacyWindowsFSEncodingFlag;
26-
PyAPI_DATA(int) Py_LegacyWindowsStdioFlag;
25+
Py_DEPRECATED(3.12) PyAPI_DATA(int) Py_LegacyWindowsFSEncodingFlag;
26+
Py_DEPRECATED(3.12) PyAPI_DATA(int) Py_LegacyWindowsStdioFlag;
2727
#endif
2828

2929
/* this is a wrapper around getenv() that pays attention to
3030
Py_IgnoreEnvironmentFlag. It should be used for getting variables like
3131
PYTHONPATH and PYTHONHOME from the environment */
32-
PyAPI_DATA(char*) Py_GETENV(const char *name);
32+
PyAPI_FUNC(char*) Py_GETENV(const char *name);
3333

3434
#ifdef __cplusplus
3535
}

Include/cpython/pystate.h

+4-1
Original file line numberDiff line numberDiff line change
@@ -279,7 +279,10 @@ PyAPI_FUNC(const PyConfig*) _PyInterpreterState_GetConfig(PyInterpreterState *in
279279
for example.
280280
281281
Python must be preinitialized to call this method.
282-
The caller must hold the GIL. */
282+
The caller must hold the GIL.
283+
284+
Once done with the configuration, PyConfig_Clear() must be called to clear
285+
it. */
283286
PyAPI_FUNC(int) _PyInterpreterState_GetConfigCopy(
284287
struct PyConfig *config);
285288

Include/fileobject.h

+3-3
Original file line numberDiff line numberDiff line change
@@ -19,14 +19,14 @@ PyAPI_FUNC(int) PyObject_AsFileDescriptor(PyObject *);
1919
/* The default encoding used by the platform file system APIs
2020
If non-NULL, this is different than the default encoding for strings
2121
*/
22-
PyAPI_DATA(const char *) Py_FileSystemDefaultEncoding;
22+
Py_DEPRECATED(3.12) PyAPI_DATA(const char *) Py_FileSystemDefaultEncoding;
2323
#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03060000
24-
PyAPI_DATA(const char *) Py_FileSystemDefaultEncodeErrors;
24+
Py_DEPRECATED(3.12) PyAPI_DATA(const char *) Py_FileSystemDefaultEncodeErrors;
2525
#endif
2626
PyAPI_DATA(int) Py_HasFileSystemDefaultEncoding;
2727

2828
#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03070000
29-
PyAPI_DATA(int) Py_UTF8Mode;
29+
Py_DEPRECATED(3.12) PyAPI_DATA(int) Py_UTF8Mode;
3030
#endif
3131

3232
/* A routine to check if a file descriptor can be select()-ed. */
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
Deprecate global configuration variable like
2+
:c:var:`Py_IgnoreEnvironmentFlag`: the :c:func:`Py_InitializeFromConfig` API
3+
should be instead. Patch by Victor Stinner.

Modules/main.c

+15-6
Original file line numberDiff line numberDiff line change
@@ -479,12 +479,23 @@ pymain_run_interactive_hook(int *exitcode)
479479
}
480480

481481

482+
static void
483+
pymain_set_inspect(PyConfig *config, int inspect)
484+
{
485+
config->inspect = inspect;
486+
_Py_COMP_DIAG_PUSH
487+
_Py_COMP_DIAG_IGNORE_DEPR_DECLS
488+
Py_InspectFlag = inspect;
489+
_Py_COMP_DIAG_POP
490+
}
491+
492+
482493
static int
483494
pymain_run_stdin(PyConfig *config)
484495
{
485496
if (stdin_is_interactive(config)) {
486-
config->inspect = 0;
487-
Py_InspectFlag = 0; /* do exit on SystemExit */
497+
// do exit on SystemExit
498+
pymain_set_inspect(config, 0);
488499

489500
int exitcode;
490501
if (pymain_run_startup(config, &exitcode)) {
@@ -517,16 +528,14 @@ pymain_repl(PyConfig *config, int *exitcode)
517528
/* Check this environment variable at the end, to give programs the
518529
opportunity to set it from Python. */
519530
if (!config->inspect && _Py_GetEnv(config->use_environment, "PYTHONINSPECT")) {
520-
config->inspect = 1;
521-
Py_InspectFlag = 1;
531+
pymain_set_inspect(config, 1);
522532
}
523533

524534
if (!(config->inspect && stdin_is_interactive(config) && config_run_code(config))) {
525535
return;
526536
}
527537

528-
config->inspect = 0;
529-
Py_InspectFlag = 0;
538+
pymain_set_inspect(config, 0);
530539
if (pymain_run_interactive_hook(exitcode)) {
531540
return;
532541
}

Python/initconfig.c

+12
Original file line numberDiff line numberDiff line change
@@ -201,6 +201,8 @@ int Py_LegacyWindowsStdioFlag = 0; /* Uses FileIO instead of WindowsConsoleIO */
201201
static PyObject *
202202
_Py_GetGlobalVariablesAsDict(void)
203203
{
204+
_Py_COMP_DIAG_PUSH
205+
_Py_COMP_DIAG_IGNORE_DEPR_DECLS
204206
PyObject *dict, *obj;
205207

206208
dict = PyDict_New();
@@ -267,15 +269,19 @@ _Py_GetGlobalVariablesAsDict(void)
267269
#undef SET_ITEM
268270
#undef SET_ITEM_INT
269271
#undef SET_ITEM_STR
272+
_Py_COMP_DIAG_POP
270273
}
271274

272275
char*
273276
Py_GETENV(const char *name)
274277
{
278+
_Py_COMP_DIAG_PUSH
279+
_Py_COMP_DIAG_IGNORE_DEPR_DECLS
275280
if (Py_IgnoreEnvironmentFlag) {
276281
return NULL;
277282
}
278283
return getenv(name);
284+
_Py_COMP_DIAG_POP
279285
}
280286

281287
/* --- PyStatus ----------------------------------------------- */
@@ -1443,6 +1449,8 @@ config_get_env_dup(PyConfig *config,
14431449
static void
14441450
config_get_global_vars(PyConfig *config)
14451451
{
1452+
_Py_COMP_DIAG_PUSH
1453+
_Py_COMP_DIAG_IGNORE_DEPR_DECLS
14461454
if (config->_config_init != _PyConfig_INIT_COMPAT) {
14471455
/* Python and Isolated configuration ignore global variables */
14481456
return;
@@ -1478,13 +1486,16 @@ config_get_global_vars(PyConfig *config)
14781486

14791487
#undef COPY_FLAG
14801488
#undef COPY_NOT_FLAG
1489+
_Py_COMP_DIAG_POP
14811490
}
14821491

14831492

14841493
/* Set Py_xxx global configuration variables from 'config' configuration. */
14851494
static void
14861495
config_set_global_vars(const PyConfig *config)
14871496
{
1497+
_Py_COMP_DIAG_PUSH
1498+
_Py_COMP_DIAG_IGNORE_DEPR_DECLS
14881499
#define COPY_FLAG(ATTR, VAR) \
14891500
if (config->ATTR != -1) { \
14901501
VAR = config->ATTR; \
@@ -1519,6 +1530,7 @@ config_set_global_vars(const PyConfig *config)
15191530

15201531
#undef COPY_FLAG
15211532
#undef COPY_NOT_FLAG
1533+
_Py_COMP_DIAG_POP
15221534
}
15231535

15241536

Python/preconfig.c

+12
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@ int _Py_HasFileSystemDefaultEncodeErrors = 0;
2424
void
2525
_Py_ClearFileSystemEncoding(void)
2626
{
27+
_Py_COMP_DIAG_PUSH
28+
_Py_COMP_DIAG_IGNORE_DEPR_DECLS
2729
if (!Py_HasFileSystemDefaultEncoding && Py_FileSystemDefaultEncoding) {
2830
PyMem_RawFree((char*)Py_FileSystemDefaultEncoding);
2931
Py_FileSystemDefaultEncoding = NULL;
@@ -32,6 +34,7 @@ _Py_ClearFileSystemEncoding(void)
3234
PyMem_RawFree((char*)Py_FileSystemDefaultEncodeErrors);
3335
Py_FileSystemDefaultEncodeErrors = NULL;
3436
}
37+
_Py_COMP_DIAG_POP
3538
}
3639

3740

@@ -56,11 +59,14 @@ _Py_SetFileSystemEncoding(const char *encoding, const char *errors)
5659

5760
_Py_ClearFileSystemEncoding();
5861

62+
_Py_COMP_DIAG_PUSH
63+
_Py_COMP_DIAG_IGNORE_DEPR_DECLS
5964
Py_FileSystemDefaultEncoding = encoding2;
6065
Py_HasFileSystemDefaultEncoding = 0;
6166

6267
Py_FileSystemDefaultEncodeErrors = errors2;
6368
_Py_HasFileSystemDefaultEncodeErrors = 0;
69+
_Py_COMP_DIAG_POP
6470
return 0;
6571
}
6672

@@ -472,6 +478,8 @@ preconfig_get_global_vars(PyPreConfig *config)
472478
config->ATTR = !(VALUE); \
473479
}
474480

481+
_Py_COMP_DIAG_PUSH
482+
_Py_COMP_DIAG_IGNORE_DEPR_DECLS
475483
COPY_FLAG(isolated, Py_IsolatedFlag);
476484
COPY_NOT_FLAG(use_environment, Py_IgnoreEnvironmentFlag);
477485
if (Py_UTF8Mode > 0) {
@@ -480,6 +488,7 @@ preconfig_get_global_vars(PyPreConfig *config)
480488
#ifdef MS_WINDOWS
481489
COPY_FLAG(legacy_windows_fs_encoding, Py_LegacyWindowsFSEncodingFlag);
482490
#endif
491+
_Py_COMP_DIAG_POP
483492

484493
#undef COPY_FLAG
485494
#undef COPY_NOT_FLAG
@@ -498,12 +507,15 @@ preconfig_set_global_vars(const PyPreConfig *config)
498507
VAR = !config->ATTR; \
499508
}
500509

510+
_Py_COMP_DIAG_PUSH
511+
_Py_COMP_DIAG_IGNORE_DEPR_DECLS
501512
COPY_FLAG(isolated, Py_IsolatedFlag);
502513
COPY_NOT_FLAG(use_environment, Py_IgnoreEnvironmentFlag);
503514
#ifdef MS_WINDOWS
504515
COPY_FLAG(legacy_windows_fs_encoding, Py_LegacyWindowsFSEncodingFlag);
505516
#endif
506517
COPY_FLAG(utf8_mode, Py_UTF8Mode);
518+
_Py_COMP_DIAG_POP
507519

508520
#undef COPY_FLAG
509521
#undef COPY_NOT_FLAG

0 commit comments

Comments
 (0)