Problem slicing a list with the C API

MRAB python at mrabarnett.plus.com
Sat Mar 12 16:40:38 EST 2022


On 2022-03-12 21:24, Jen Kris via Python-list wrote:
> I have a C API project where I have to slice a list into two parts.   Unfortunately the documentation on the slice objects is not clear enough for me to understand how to do this, and I haven’t found enough useful info through research.  The list contains tuple records where each tuple consists of a dictionary object and a string.
> 
> The relevant part of the Python code is:
> 
> half_slice = int(len(dictdata) * 0.5)
> subdata_a = dictdata[half_slice:]
> subdata_b = dictdata[:half_slice]
> 
> This is what I’ve done so far with the C API:
> 
> int64_t Calc_Slices(PyObject* pDictdata, int64_t records_count)
> {
> long round_half = records_count * 0.5;
> PyObject* half_slice = PyLong_FromLong(round_half);
> 
> PyObject* slice = PySlice_New(PyLong_FromLong(0), half_slice, 0);
> PyObject* subdata_a = PyObject_GetItem(pDictddata, slice);
> 
> return 0;
> }
> 
> On the final line (subdata_a) I get a segfault.  I know that the second parameter of  PyObject_GetItem is a “key” and I suspect that’s where the problem comes from, but I don’t understand what a key is in this context.
> 
> The code shown above omits error handling but none of the objects leading up to the final line is null, they all succeed.
> 
> Thanks for any ideas.
> 
Use PySequence_GetSlice to slice the list.

Also, why use floats when you can use integers?

     long round_half = records_count / 2;

(In Python that would be half_slice = len(dictdata) // 2.)


More information about the Python-list mailing list