2009-11-25 6 views
4

ctypes를 사용하여 내부 파이썬 구조에서 데이터를 추출하려고합니다. 즉, 나는 xrange에 4 개 개의 필드를 읽으려고 해요 : 파이썬 자체 내에서 같은 필드에서지고의 표준 방법은xrange 내부 구조에 액세스

typedef struct { 
    PyObject_HEAD 
    long start; 
    long step; 
    long len; 
} rangeobject; 

있습니까?

답변

5

당신은 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 
+0

죄송합니다, 나는 Python 2.5와 호환되어야한다는 질문을 잊어 버렸습니다. 직렬화는 파이썬 2.6에서만 추가되었습니다. – UsAaR33

+0

'ctypes' 예제를 추가했습니다. –

+0

훌륭하고 훌륭한 답변입니다! – jathanism

0

ctypes 모듈은 파이썬 내부에 ​​액세스하기위한 것이 아닙니다. ctypes는 C 라이브러리를 C 언어로 다루지 만 Python으로 코딩합니다.

아마도 C 확장자를 사용하는 것이 좋을 것입니다. C 확장자는 여러면에서 ctypes의 반대입니다. C 확장을 사용하면 Python 코드를 Python 용어로 처리하지만 C 언어로 코드화합니다.

업데이트 : 순수 Python을 원하기 때문에 내장 xrange 객체의 내부에 액세스해야하는 이유는 무엇입니까? xrange는 매우 간단합니다 : 파이썬에서 자신 만의 것을 만들고, 원하는 것을 해보십시오.

+0

, 내가 하나를 사용합니다. 그러나 배포하고있는 것은 순수한 파이썬으로 작성해야합니다. 나는 파이썬 확장을 컴파일 할 사용자를 가질 수 없다. – UsAaR33

+0

파이썬 2.5에서 이러한 객체를 직렬화해야하는 라이브러리 (PiCloud (.com)의 오픈 소스 부분)를 구현하고 있습니다. 참고 : 항상 str (xrange_object)을 수행하고 구문 분석 할 수는 있지만 매우 kludgey가되는 것 외에도 다른 C 객체에 대해서는 작동하지 않습니다. – UsAaR33

관련 문제