Search code examples
pythonctypescpythonxrange

Accessing xrange internal structure


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?


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