Вопрос

Я пытаюсь использовать ctypes для извлечения данных из внутренних структур python.А именно, я пытаюсь прочитать 4 поля в xrange:

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 и делайте с ним то, что вы хотите.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top