2009-11-25 106 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