我正在尝试使用 ctypes 从内部 python 结构中提取数据。即,我正在尝试读取 xrange 中的 4 个字段:
typedef struct {
PyObject_HEAD
long start;
long step;
long len;
} rangeobject;
是否有任何标准方法可以在 python 本身中获取这些字段?
您可以访问所需的数据,而无需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
ctypes 模块不是用来访问 Python 内部的。ctypes 允许您使用 C 术语处理 C 库,但使用 Python 编码。
您可能想要一个 C 扩展,它在许多方面与 ctypes 相反。使用 C 扩展,您可以使用 Python 术语处理 Python 代码,但使用 C 编写代码。
更新:既然您想要纯 Python,为什么需要访问内置 xrange 对象的内部?xrange 非常简单:用 Python 创建你自己的,然后用它做你想做的事。