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 で行います。
おそらく、多くの点で ctypes の反対である C 拡張が必要です。C 拡張では、Python コードを Python 用語で扱いますが、コードは C で記述します。
更新: 純粋な Python が必要なのに、組み込みの xrange オブジェクトの内部にアクセスする必要があるのはなぜですか? xrange は非常に単純です: Python で独自のものを作成し、それを使ってやりたいことを行います。