ctypes를 사용하여 내부 파이썬 구조에서 데이터를 추출하려고합니다. 즉, 나는 xrange에 4 개 개의 필드를 읽으려고 해요 : 파이썬 자체 내에서 같은 필드에서지고의 표준 방법은xrange 내부 구조에 액세스
typedef struct {
PyObject_HEAD
long start;
long step;
long len;
} rangeobject;
있습니까?
ctypes를 사용하여 내부 파이썬 구조에서 데이터를 추출하려고합니다. 즉, 나는 xrange에 4 개 개의 필드를 읽으려고 해요 : 파이썬 자체 내에서 같은 필드에서지고의 표준 방법은xrange 내부 구조에 액세스
typedef struct {
PyObject_HEAD
long start;
long step;
long len;
} rangeobject;
있습니까?
당신은 ctypes
없이 필요한 데이터에 액세스 할 수 있습니다 :
>>> obj = xrange(1,11,2)
>>> obj.__reduce__()[1]
(1, 11, 2)
>>> len(obj)
5
주, __reduce__()
방법은 직렬화 정확히입니다. 자세한 내용은 this chapter in documentation을 참조하십시오.
업데이트 :하지만 당신은 너무 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 모듈은 파이썬 내부에 액세스하기위한 것이 아닙니다. ctypes는 C 라이브러리를 C 언어로 다루지 만 Python으로 코딩합니다.
아마도 C 확장자를 사용하는 것이 좋을 것입니다. C 확장자는 여러면에서 ctypes의 반대입니다. C 확장을 사용하면 Python 코드를 Python 용어로 처리하지만 C 언어로 코드화합니다.
업데이트 : 순수 Python을 원하기 때문에 내장 xrange 객체의 내부에 액세스해야하는 이유는 무엇입니까? xrange는 매우 간단합니다 : 파이썬에서 자신 만의 것을 만들고, 원하는 것을 해보십시오.
죄송합니다, 나는 Python 2.5와 호환되어야한다는 질문을 잊어 버렸습니다. 직렬화는 파이썬 2.6에서만 추가되었습니다. – UsAaR33
'ctypes' 예제를 추가했습니다. –
훌륭하고 훌륭한 답변입니다! – jathanism