4

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

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

是否有任何标准方法可以在 python 本身中获取这些字段?

4

2 回答 2

5

您可以访问所需的数据,而无需ctypes

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

请注意,该__reduce__()方法完全用于序列化。阅读文档中的本章以获取更多信息。

更新:但确保您也可以访问内部数据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
于 2009-11-25T08:47:17.177 回答
0

ctypes 模块不是用来访问 Python 内部的。ctypes 允许您使用 C 术语处理 C 库,但使用 Python 编码。

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

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

于 2009-11-25T03:07:16.880 回答