我試圖用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