2009-11-25 115 views
4

我试图用ctypes从内部python结构中提取数据。也就是说,我想在x范围阅读4个领域:访问xrange内部结构

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

有没有在Python本身内等领域取得的任何标准的方式?

回答

5

您可以在不​​访问所需数据:

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

注意,那__reduce__()方法是完全序列化。请阅读this chapter in documentation了解更多信息。

更新:但相信你一定能​​过访问内部数据:

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 
+0

对不起,我忘了在提问中提到我需要与Python 2.5兼容。序列化仅在Python 2.6中添加。 – UsAaR33 2009-11-25 09:16:45

+0

我已添加'ctypes'示例。 – 2009-11-25 09:39:02

+0

优秀的,优秀的答案! – jathanism 2009-11-25 14:35:39

0

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

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

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

+0

在理想世界中,我会用一个。 但是,我分发的内容必须用纯Python编写;我不能让用户编译python扩展。 – UsAaR33 2009-11-25 03:18:14

+0

我正在实现一个库(PiCloud(.com)的开源部分),它需要在python 2.5中序列化这些对象。 注意:我总是可以做一个str(xrange_object)然后解析,但除了非常kludgey不适用于其他C对象,我试图得到。 – UsAaR33 2009-11-25 04:28:07