Description
The Python C API has a long history. Many functions known to be ackwards are kept because of "backward compatibility". The cost of removing them is higher than the benefits.
My use case is: I would like to write a new C extension with only APIs with no known issues. For example, I would like to avoid borrowed references, ambiguous return values, etc.
Can we define a subset of the Python C API for that?
It can be a practical implementation of issue #53: make the C API smaller. Such subset would be smaller by design.
In such subset, we can consider to have different a different deprecation policy: more aggressive. Developers who opt-in for such API are aware of the ongoing effort to fix the C API and so are more eagger to update their code than unmaintained projects which continue to work only because the C API didn't break so far.
In my first C API hack in 2017, I added multiple macros to opt-out from APIs known to have issues. Examples:
Py_NEWCAPI
: future-proof name, right? :-)Py_NEWCAPI_NO_STRUCT
Py_NEWCAPI_NO_MACRO
Py_NEWCAPI_BORROWED_REF
I'm not sure if such design is future-proof, C extensions may not be aware that next opt-out options would be added. Maybe it's better to have a single big button: "drop all legacy, give me only good API".
Question: if we design such subset, would it be ok to override names of the regular API? For example, can we rename PyDict_GetItemRef()
(regular API) as PyDict_GetItem()
? How would it work at the ABI level? Would it be confusing when exchanging code written with the two APIs?
In issue #52, @markshannon proposed using different name prefixes. Rather than using suffixes.
So maybe PyDict_GetItemRef()
could become PyNew_Dict_GetItem()
, PyNewFinal2CorrectThisThime_Dict_GetItem()
? :-)