Skip to content

gh-128863: Deprecate private C API functions#128864

Merged
vstinner merged 5 commits intopython:mainfrom
vstinner:deprecate_private
Jan 22, 2025
Merged

gh-128863: Deprecate private C API functions#128864
vstinner merged 5 commits intopython:mainfrom
vstinner:deprecate_private

Conversation

@vstinner
Copy link
Member

@vstinner vstinner commented Jan 15, 2025

  • _PyBytes_Join()
  • _PyDict_GetItemStringWithError()
  • _PyDict_Pop()
  • _PyThreadState_UncheckedGet()
  • _PyUnicode_AsString()
  • _Py_HashPointer()
  • _Py_fopen_obj()

Replace _Py_HashPointer() with Py_HashPointer().

Remove references to deprecated functions.


📚 Documentation preview 📚: https://cpython-previews--128864.org.readthedocs.build/

* _PyBytes_Join()
* _PyDict_GetItemStringWithError()
* _PyDict_Pop()
* _PyThreadState_UncheckedGet()
* _PyUnicode_AsString()
* _Py_HashPointer()
* _Py_fopen_obj()

Replace _Py_HashPointer() with Py_HashPointer().

Remove references to deprecated functions.
@vstinner
Copy link
Member Author

@encukou
Copy link
Member

encukou commented Jan 15, 2025

This is extra work for both you and for users. I do not see how this would reduce our maintenance burden. I also don't see any other benefit of this PR.

@methane
Copy link
Member

methane commented Jan 16, 2025

Removing them from Python 3.16 seems a little hurried. Unless there is a specific reason to remove it sooner, how about schedule it for removal in Python 3.18?

@vstinner
Copy link
Member Author

Code search on PyPI top 7,500 projects (2024-10-16).

_PyBytes_Join(): 4 projects

  • cython (3.0.11)
  • dbnd (1.0.25.2)
  • mod_wsgi (5.0.1)
  • mypy (1.12.0)

_PyDict_GetItemStringWithError(): 3 projects

  • catboost (1.2.7)
  • mypy (1.12.0)
  • numpy (2.1.2)

_PyDict_Pop(): 1 project

  • cython (3.0.11)

_PyThreadState_UncheckedGet(): 25 projects

  • CoolProp (6.6.0)
  • aplr (10.6.3)
  • cffi (1.17.1)
  • correctionlib (2.6.4)
  • cython (3.0.11)
  • ddtrace (2.14.2)
  • debugpy (1.8.7)
  • dlib (19.24.6)
  • frozendict (2.4.6)
  • mmcif (0.89.0)
  • onnx (1.17.0)
  • onnx-simplifier (0.4.36)
  • onnxoptimizer (0.3.13)
  • onnxsim (0.4.36)
  • opencc (1.1.9)
  • praat_parselmouth (0.4.5)
  • ptvsd (4.3.2)
  • pybind11 (2.13.6)
  • pybind11_global (2.13.6)
  • pydevd (3.1.0)
  • pydevd_pycharm (243.19420.35)
  • pymatching (2.2.1)
  • pythonnet (3.0.4)
  • vaex-core (4.17.1)
  • xatlas (0.0.9)

_PyUnicode_AsString(): 1 project

  • cvxopt (1.3.2)

_Py_HashPointer(): 3 projects

  • cffi (1.17.1)
  • igraph (0.11.6)
  • numba (0.60.0)

_Py_fopen_obj(): 1 project

  • pybind11 (2.13.6)

I ignored projects including copies of these dependencies such as pybind11 copies.


Total: 33 projects

Affected projects (33):

  • CoolProp (6.6.0)
  • aplr (10.6.3)
  • catboost (1.2.7)
  • cffi (1.17.1)
  • correctionlib (2.6.4)
  • cvxopt (1.3.2)
  • cython (3.0.11)
  • dbnd (1.0.25.2)
  • ddtrace (2.14.2)
  • debugpy (1.8.7)
  • dlib (19.24.6)
  • frozendict (2.4.6)
  • igraph (0.11.6)
  • mmcif (0.89.0)
  • mod_wsgi (5.0.1)
  • mypy (1.12.0)
  • numba (0.60.0)
  • numpy (2.1.2)
  • onnx (1.17.0)
  • onnx-simplifier (0.4.36)
  • onnxoptimizer (0.3.13)
  • onnxsim (0.4.36)
  • opencc (1.1.9)
  • praat_parselmouth (0.4.5)
  • ptvsd (4.3.2)
  • pybind11 (2.13.6)
  • pybind11_global (2.13.6)
  • pydevd (3.1.0)
  • pydevd_pycharm (243.19420.35)
  • pymatching (2.2.1)
  • pythonnet (3.0.4)
  • vaex-core (4.17.1)
  • xatlas (0.0.9)
@vstinner
Copy link
Member Author

@methane:

Removing them from Python 3.16 seems a little hurried. Unless there is a specific reason to remove it sooner, how about schedule it for removal in Python 3.18?

I'm fine with using a longer deprecation period for _PyThreadState_UncheckedGet() which is more frequently used.

Other functions are used by less than 5 projects and so can use a faster deprecation period, no?

@methane
Copy link
Member

methane commented Jan 16, 2025

  • PyBytes_Join is added in Python 3.14.
  • Py_fopen is added in 3.14.

Python 3.13 will reach EOL in 2029. I want to keep it until 2031 (2029+2).

  • PyDict_GetItemStringRef is added in 3.13.
  • PyDict_Pop is added in 3.13.
  • PyThreadState_GetUnchecked is added in 3.13.
  • Py_HashPointer is added in 3.13.

Python 3.12 will reach EOL in 2028. I want to keep it until 2030 (2028+2).

Removing _PyUnicode_AsString with minimum deprecation period is OK because PyUnicode_AsUTF8 is added in 3.3.

@vstinner
Copy link
Member Author

Removing them from Python 3.16 seems a little hurried. Unless there is a specific reason to remove it sooner, how about schedule it for removal in Python 3.18?

I updated my PR to postpone the removal to Python 3.18.

@vstinner
Copy link
Member Author

Copy link
Member

@serhiy-storchaka serhiy-storchaka left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I am not sure that it is worth to go such far in preserving compatibility for private C API. Usually we just changed it at will, it was a fair play.

@vstinner
Copy link
Member Author

I am not sure that it is worth to go such far in preserving compatibility for private C API. Usually we just changed it at will, it was a fair play.

Do you suggest to remove these functions earlier?

@serhiy-storchaka
Copy link
Member

Were not some of them already removed?

This is only my grumbling. I would remove them without warning if there is a replacement. You have to ask other core developers if they have reasons to keep the old private C API.

Removing a private C API is not the worst thing that can be happen if you use private C API. It can change semantic -- start returning a strong reference instead of a weak reference or vice versa, start stealing a reference, change the order of parameters, etc.

But if keep them -- your PR LGTM.

@vstinner vstinner enabled auto-merge (squash) January 22, 2025 10:37
@vstinner vstinner merged commit 9012fa7 into python:main Jan 22, 2025
41 checks passed
@vstinner vstinner deleted the deprecate_private branch January 22, 2025 11:04
@vstinner
Copy link
Member Author

Merged, thanks for review.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

5 participants