STINNER Victor <vstin...@python.org> added the comment:

Mark Shannon:
> The old functions aren't going away, so these additional functions provide no 
> real safety. You can't stop C programmers trading away correctness for some 
> perceived performance benefit :(

In my experience, newcomers tend to copy existing more. If slowly, the code 
base moves towards safer code less error-prone code like Py_NewRef() or 
Py_SETREF(), slowly, we will avoid a bunch of bugs.


> If we were designing the API from scratch, then this would be a better set of 
> functions. But because the old functions remain, it just means we are making 
> the API larger.

New API VS enhance the existing API. So far, no approach won. I wrote the PEP 
620 to enhance the C API and towards a more opaque API, and there is the HPy 
project which is a new API written correctly from the start. But HPy is not 
usable yet, and migrating C extensions to HPy will take years.

Also, enhancing the existing API and writing a new API are not exclusive option.

What is the issue of making the C API larger?


> Please don't add macros, use inline functions.

For Py_NewRef(), I used all at once :-) static inline function + function + 
macro :-)

It's exported as a regular function for the stable ABI, but overriden by a 
static inline function with a macro. The idea is to allow to use it for 
developers who cannot use static inline functions (ex: extension modules not 
written in C).

I chose to redefine functions as static inline functions in the limited C API. 
If it's an issue, we can consider to only do that in Include/cpython/object.h.


> There seems to be some confusion about borrowed references and stolen 
> references in 
> https://pythoncapi.readthedocs.io/bad_api.html#borrowed-references
"Stealing" a reference is perfectly safe. Returning a "borrowed" reference is 
not.
>
> So, don't bother with `PyTuple_SetItemRef()`, as `PyTupleSetItem()` is safe.

I'm really annoyed that almost all functions increase the refcount of their 
arugments, except a bunch of special cases. I would like to move towards a more 
regular API.

PyTuple_SetItem() is annoying because it steals a reference to the item. Also, 
it doesn't clear the reference of the previous item, which is also likely to 
introduce a reference leak.

----------

_______________________________________
Python tracker <rep...@bugs.python.org>
<https://bugs.python.org/issue42294>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to