Accessing xrange internal structure

cpython, ctypes, python, xrange

Solution

You can access data you need without `ctypes`:

>>> obj = xrange(1,11,2)
>>> obj.__reduce__()[1]
(1, 11, 2)
>>> len(obj)
5

Note, that `__reduce__()` method is exactly for serialization. Read this chapter in documentation for more information.

Update: But sure you can access internal data with `ctypes` too:

from ctypes import *

PyObject_HEAD = [
    ('ob_refcnt', c_size_t),
    ('ob_type', c_void_p),
]

class XRangeType(Structure):
    _fields_ = PyObject_HEAD + [
        ('start', c_long),
        ('step', c_long),
        ('len', c_long),
    ]

range_obj = xrange(1, 11, 2)

c_range_obj = cast(c_void_p(id(range_obj)), POINTER(XRangeType)).contents
print c_range_obj.start, c_range_obj.step, c_range_obj.len

Problem

I'm trying to use ctypes to extract data from internal python structures. Namely, I'm trying to read the 4 fields in an xrange: ``` typedef struct { PyObject_HEAD long start; long step; long len; } rangeobject; ``` Is there any standard way of getting at such fields within python itself?

Original source