I like the idea but I don't understand the full impact yet.
That's my job to assess.

For my research, I was also trying to have a similar compatibility hack for
the changes I have had to do
to allow GC integration.

> This project only targets extension modules written in C by using
> directly the "Python.h" API. I advise you to use Cython or HPy to no
> longer be bothered with incompatible C API changes at every Python
> release ;-)

Is HPy ready yet given IIRC, there is no even first release yet? I stand to
be corrected.
I reckon it will still go through a period of incompatible changes for some
time/months too.

On Wed, Jun 2, 2021 at 8:47 PM Victor Stinner <vstin...@python.org> wrote:

> Hi,
>
> What do you think of promoting the pythoncapi_compat project that I'm
> introducing below in the "C API: Porting to Python 3.10" section of
> What's New In Python 3.10?
>
> Should this project be moved under the GitHub psf organization to have
> a more "future proof" URL?
>
> I would like to promote this project to prepare C extensions
> maintainers for the following incompatible C API change (Py_TYPE) that
> I would like to push into Python 3.11:
> https://github.com/python/cpython/pull/26493
> (Py_REFCNT was already converted to a static inline function in Python
> 3.10.)
>
> I already made this Py_TYPE change in Python 3.10, but I had to revert
> it since it broke too many projects. Since last year, I upgraded most
> of these broken projects, I created the pythoncapi_compat project, and
> I succeeded to use upgrade_pythoncapi.py script and copy the
> pythoncapi_compat.h header file in multiple C extensions.
>
> C extensions written with Cython are not affected. I already fixed
> Cython last year to emit code compatible with my incoming incompatible
> change. If it's not done yet, you only have to regenerate the C files
> using a recent Cython version.
>
> --
>
> I wrote a new script which adds Python 3.10 support to your C
> extensions without losing Python 2.7 support:
> https://github.com/pythoncapi/pythoncapi_compat
>
> To add Python 3.10 support to your C extension, go to its source
> directory and run:
>
>   /path/to/upgrade_pythoncapi.py .
>
> It upgrades all C files (.c) in the current directory and
> subdirectories. For example, it replaces "op->ob_type" with
> "Py_TYPE(op)". It creates an ".old" copy of patched files.
>
> Use the -o option to select operations:
>
> * -o Py_TYPE: only replace "obj->ob_type" with "Py_TYPE(obj)".
> * -o all,-PyMem_MALLOC: run all operations, but don't replace
> PyMem_MALLOC(...) with PyMem_Malloc(...).
>
> --
>
> The upgrade_pythoncapi.py script relies on the pythoncapi_compat.h
> header file that I wrote to provide recent Python 3.9-3.11 C functions
> on old Python versions. Examples: Py_NewRef() and
> PyThreadState_GetFrame(). Functions are implemented as simple static
> inline functions to avoid requiring to link your extension to a
> dynamic library.
>
> You can already use the new Py_NewRef() and Py_IsNone() Python 3.10
> functions in your projects without losing support for Python 2.7-3.9!
>
> --
>
> The script also replaces "frame->f_back" with
> "_PyFrame_GetBackBorrow(frame)".
>
> The _PyFrame_GetBackBorrow() function doesn't exist in the Python C
> API, it's only provided by pythoncapi_compat.h to ease the migration
> of C extensions. I advise you to replace _PyFrame_GetBackBorrow()
> (borrowed reference) with PyFrame_GetBack() (strong reference).
>
> --
>
> This project is related to my PEP 620 "Hide implementation details
> from the C API" which tries to make the C API more abstract to later
> allow to implement new optimization in CPython and to make other
> Python implementations like PyPy faster when running C extensions.
>
> Article on the creation of the pythoncapi project:
> https://vstinner.github.io/pythoncapi_compat.html
>
> The main drawback of this project is that it uses regular expressions
> to parse C code. Such "parser" can miss C code which has to be patched
> manually. In my experience, additional manual changes are really rare
> and take less than 1 minute on a very large C extension like numpy.
>
> --
>
> This project only targets extension modules written in C by using
> directly the "Python.h" API. I advise you to use Cython or HPy to no
> longer be bothered with incompatible C API changes at every Python
> release ;-)
>
> * https://cython.org/
> * https://hpy.readthedocs.io/
>
> I hope that my script will facilitate migration of C extensions to HPy.
>
> Victor
> --
> Night gathers, and now my watch begins. It shall not end until my death.
> _______________________________________________
> Python-Dev mailing list -- python-dev@python.org
> To unsubscribe send an email to python-dev-le...@python.org
> https://mail.python.org/mailman3/lists/python-dev.python.org/
> Message archived at
> https://mail.python.org/archives/list/python-dev@python.org/message/KHDZGCNOYEDUTSPAATUDP55ZSSQM5RRC/
> Code of Conduct: http://python.org/psf/codeofconduct/
>


-- 
Best,
Joannah Nanjekye

*"You think you know when you learn, are more sure when you can write, even
more when you can teach, but certain when you can program." Alan J. Perlis*
_______________________________________________
Python-Dev mailing list -- python-dev@python.org
To unsubscribe send an email to python-dev-le...@python.org
https://mail.python.org/mailman3/lists/python-dev.python.org/
Message archived at 
https://mail.python.org/archives/list/python-dev@python.org/message/FNZMYPHGV4LPWSYDCRIVAB4RWAXIJU4T/
Code of Conduct: http://python.org/psf/codeofconduct/

Reply via email to