
Le mar. 7 juil. 2020 à 17:21, Inada Naoki <songofacandy@gmail.com> a écrit :
This PEP proposes to remove deprecated ``Py_UNICODE`` encoder APIs in Python 3.11:
Overall, I like the plan. IMHO 3.11 is a reasonable target version, since on the top 4000 projects, only 2 are affected and it is easy to fix them.
Python 3.9 ----------
Add ``Py_DEPRECATED(3.3)`` to following APIs. This change is committed already [3]_. All other APIs have been marked ``Py_DEPRECATED(3.3)`` already.
* ``PyUnicode_EncodeDecimal()`` * ``PyUnicode_TransformDecimalToASCII()``.
Document all APIs as "will be removed in version 3.11".
I guess that if the release manager is not ok to add the two remaining Py_DEPRECATED() warnings, they can be added to 3.10 instead.
Make some private APIs public
``PyUnicode_EncodeUTF7()`` doesn't have public alternative APIs.
Some APIs have alternative public APIs. But they are missing ``const char *errors`` or ``int byteorder`` parameters.
If needed, new functions can be added independently of this PEP.
Using runtime warning ---------------------
These APIs doesn't release GIL for now. Emitting a warning from such APIs is not safe. See this example.
.. code-block::
PyObject *u = PyList_GET_ITEM(list, i); // u is borrowed reference. PyObject *b = PyUnicode_EncodeUTF8(PyUnicode_AS_UNICODE(u), PyUnicode_GET_SIZE(u), NULL); // Assumes u is still living reference. PyObject *t = PyTuple_Pack(2, u, b); Py_DECREF(b); return t;
If we emit Python warning from ``PyUnicode_EncodeUTF8()``, warning filters and other threads may change the ``list`` and ``u`` can be a dangling reference after ``PyUnicode_EncodeUTF8()`` returned.
Additionally, since we are not changing behavior but removing C APIs, runtime ``DeprecationWarning`` might not helpful for Python developers. We should warn to extension developers instead.
DeprecationWarning is hidden by default: users would not be impacted. I don't think that encoding functions are special enough to skip these warnings. I think that it's reasonable to change the behavior on these deprecated functions to emit a warning. Victor -- Night gathers, and now my watch begins. It shall not end until my death.