我试图用ctypes从内部python结构中提取数据。也就是说,我想在x范围阅读4个领域:访问xrange内部结构
typedef struct {
PyObject_HEAD
long start;
long step;
long len;
} rangeobject;
有没有在Python本身内等领域取得的任何标准的方式?
我试图用ctypes从内部python结构中提取数据。也就是说,我想在x范围阅读4个领域:访问xrange内部结构
typedef struct {
PyObject_HEAD
long start;
long step;
long len;
} rangeobject;
有没有在Python本身内等领域取得的任何标准的方式?
您可以在不访问所需数据:
>>> 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
ctypes模块不适用于访问Python内部。 ctypes让你用C语言处理C库,但是用Python编码。
您可能想要一个C扩展,它在很多方面与ctypes相反。使用C扩展名,您使用Python术语处理Python代码,但代码为C.
更新:既然您想要纯Python,您为什么需要访问内置的xrange对象的内部? xrange非常简单:用Python创建你自己的,并且用它做你想做的。
对不起,我忘了在提问中提到我需要与Python 2.5兼容。序列化仅在Python 2.6中添加。 – UsAaR33 2009-11-25 09:16:45
我已添加'ctypes'示例。 – 2009-11-25 09:39:02
优秀的,优秀的答案! – jathanism 2009-11-25 14:35:39