访问xrange内部结构

时间:2009-11-25 02:53:01

标签: python ctypes cpython xrange

我正在尝试使用ctypes从内部python结构中提取数据。也就是说,我正在尝试读取xrange中的4个字段:

typedef struct {
    PyObject_HEAD
    long    start;
    long    step;
    long    len;
} rangeobject;

有没有标准的方法来获取python本身的这些字段?

2 个答案:

答案 0 :(得分:5)

您可以在不ctypes的情况下访问所需的数据:

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

注意,__reduce__()方法完全用于序列化。请阅读this chapter in documentation以获取更多信息。

更新:但您也可以确保使用ctypes访问内部数据:

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

答案 1 :(得分:0)

ctypes模块不适用于访问Python内部。 ctypes允许你用C语言处理C库,但用Python编码。

你可能想要一个C扩展,它在很多方面与ctypes相反。使用C扩展,您可以用Python术语处理Python代码,但使用C语言编写代码。

更新:既然你想要纯Python,你为什么需要访问内置xrange对象的内部? xrange非常简单:在Python中创建自己的,并用它做你想做的事。