On Tue, 23 Jun 2020 11:18:37 +0200
Victor Stinner <vstin...@python.org> wrote:
> 
> Pseudo-code:
> 
> void iterate(PyObject *obj)
> {
> PyObjectPP_View view;
> 
> if (PyObjectPP_View_Get(&view, obj)) {
>   // fast-path: the object provides a PyObject** view
>   for (Py_ssize_t i=0; i < view.len; i++ {
>     PyObject *item = view.array[i];
>     ...
>   }
>   PyObjectPP_View_Release(&view);
> }
> else {
>   // slow code path using PySequence_GetItem() or anything else
>   ...
> }

It is quite cumbersome for extension code to have to re-implement all
this by hand.  Instead, it would be nice to have a "Visit" primitive so
that one can write e.g.:

void iterate(PyObject* obj)
{
  Py_VisitObjectSequence([&](PyObject* item) {
    // ...
  });
}

The above is a C++ lambda function (a closure, actually).  The C
spelling would be less nice, and you'd have to ensure that it is still
performant (i.e., that the visitor is inlined inside the iteration
loop - at least in release builds).

(I called it Py_VisitObjectSequence so that you can also have
Py_VisitIntSequence, Py_VisitFloatSequence, etc.)

Regards

Antoine.

_______________________________________________
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/4SWMGP54OWHE3CBW23NUP5KF4WK5R4UV/
Code of Conduct: http://python.org/psf/codeofconduct/

Reply via email to