The difference between an API to configure Python initialization and an API to access PyTypeObject is that we can make some trade-offs in terms of performance overhead for the config API: it’s ok to use strcmp(). For PyTypeObject, nope, it must be as fast as possible.
Are you proposing to get configuration before the initialization, or after Py_InitializeFromInitConfig
()?
Before, is it really useful? If you want a specific value, just set it, no?
When I designed PEP 587, I proposed a way to: (1) read the config which included the “Path Configuration”, (2) modify the config including “adding a path to module_search_paths”, (3) “write” the config (initialize Python). Since Python 3.8, this part changed: the path configuration is no longer “read” before the actual Python initialization, it’s only computed “after” Python initialized.
After Python initialization, I am not sure if PyInitConfig would be a good fit to read the current “initialization” state.
There were long discussions about exposing PyConfig which went nowhere (no API was added):
- Expose _PyCoreConfig structure to Python · Issue #78100 · python/cpython · GitHub
- Allow efficient read access to PyConfig options · Issue #99872 · python/cpython · GitHub
- [C API] Deprecate Global Configuration Variables like Py_IgnoreEnvironment · Issue #93103 · python/cpython · GitHub
Problem: private APIs to access PyConfig are gone (moved to the internal C API) in Python 3.13.
Maybe we need a new stable ABI / API to get “runtime” configuration, but it would have no “config” argument, since values would be read from “Python”:
- PyConfig_GetInt(name: str)
- PyConfig_GetStr(name: str)
- etc.
For options accessed most commonly, we can consider adding specialized API to avoid name string, to provide best performance. I’m thinking about Cython which needs to access a few config options frequently.
Notice the difference between “init config” (before Python is “created”) and “config” (runtime config, while Python is running).
@encukou: Would PyConfig_GetInt() fit your use cases? Or do you think that PyInitConfig_GetInt()
is needed?