2009-11-25 4 views
4

J'essaie d'utiliser ctypes pour extraire des données de structures internes python. A savoir, je suis en train de lire les 4 champs dans un xrange:Accès à la structure interne xrange

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

Est-il possible d'obtenir la norme dans ces domaines au sein de Python lui-même?

Répondre

5

Vous pouvez accéder aux données dont vous avez besoin sans ctypes:

>>> obj = xrange(1,11,2) 
>>> obj.__reduce__()[1] 
(1, 11, 2) 
>>> len(obj) 
5 

Notez que la méthode __reduce__() est exactement pour la sérialisation. Lisez this chapter in documentation pour plus d'informations.

Mise à jour: Mais que vous pouvez accéder à des données internes avec ctypes aussi:

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

Désolé, j'ai oublié de mentionner dans la question que je dois être compatible avec Python 2.5. La sérialisation n'a été ajoutée que dans python 2.6. – UsAaR33

+0

J'ai ajouté l'exemple 'ctypes'. –

+0

Excellent, excellente réponse! – jathanism

0

Le module ctypes n'est pas conçu pour accéder aux composants internes Python. ctypes vous permet de traiter les bibliothèques C en termes C, mais en codant en Python.

Vous voulez probablement une extension C, qui à bien des égards est l'opposé de ctypes. Avec une extension C, vous traitez le code Python en termes Python, mais le code en C.

MISE À JOUR: Puisque vous voulez du Python pur, pourquoi avez-vous besoin d'accéder aux internes d'un objet xrange intégré? xrange est très simple: créez le vôtre en Python, et faites ce que vous voulez avec.

+0

Dans le monde idéal, je voudrais utiliser un. Cependant, ce que je distribue doit être écrit en python pur; Je ne peux pas avoir les utilisateurs pour compiler des extensions python. – UsAaR33

+0

J'implémente une bibliothèque (partie open-source de PiCloud (.com)) qui doit sérialiser de tels objets dans python 2.5. Note: Je peux toujours faire un str (xrange_object) et puis analyser, mais en plus d'être très kludgey ne fonctionnera pas pour les autres objets C que j'essaie d'obtenir. – UsAaR33

Questions connexes