Je veux imiter un morceau de code C en Python avec CTYPES, le code est quelque chose comme: dans CTYPES Il n'est pas possible de faire ce qui suit: p> import copy
p0 = Point()
p1 = copy.deepcopy(p0) #or just a shallow copy for this example
5 Réponses :
Je pense aussi à définir une méthode comme: mais il pourrait y avoir des options encore plus agréables ... p> p>
Opérations du pointeur Comme règle ne sont pas une mémoire très sûre. Je créerais des cours d'enveloppe pour chaque type de données Silt vous intéresse et laissez-les gérer les opérations de copie du pointeur. À peu près comme si tu fais ici. Il existe des fonctions de Lambda et de carte que vous pouvez utiliser récursivement comme sucre syntaxique. P>
Prix de la pensée à haute voix .. Il y a des métaclasses qui peuvent être utilisés un joli mécanisme de cartographie. code.Activité. com / recettes / 576666
Vous pouvez utiliser une affectation de séquence pour copier les objets pointus (plutôt que d'affecter à P.Contents code>, qui modifie la valeur du pointeur):
>>> o1 = Point(1, 1)
>>> o2 = Point(2, 2)
>>> print (o1.x, o1.y, addressof(o1)), (o2.x, o2.y, addressof(o2))
(1, 1, 6474004) (2, 2, 6473524)
>>> copy(o2, o1)
>>> pprint (o1.x, o1.y, addressof(o1)), (o2.x, o2.y, addressof(o2))
(1, 1, 6474004) (1, 1, 6473524)
>>> o1 = Point(1, 1), o2 = Point(2, 2)
>>> print (o1.x, o1.y, addressof(o1)), (o2.x, o2.y, addressof(o2))
(1, 1, 6473844) (2, 2, 6473684)
>>> p1, p2 = pointer(o1), pointer(o2)
>>> addressof(p1.contents), addressof(p2.contents)
(6473844, 6473684)
>>> ptr_copy(p1, p2)
>>> print (o1.x, o1.y, addressof(o1)), (o2.x, o2.y, addressof(o2))
(2, 2, 6473844) (2, 2, 6473684)
>>> addressof(p1.contents), addressof(p2.contents)
(6473844, 6473684)
Semblait prometteur, mais cela change simplement le pointee: -s l'adresse d'impression de (SRC) et l'adresse de (DST.Contents) après avoir affecté la vérification.
Ces fonctions ne sont pas censées être transmises à des pointeurs, elles sont censées être les objets de structure code> CTTYPES CODE>. Si vous souhaitez une fonction analogue à votre C copy_point code>, dactez
dst [0] = src [0] code>.
Hmmmm ... Je ne peux pas voir pourquoi le comportement a changé de faire dST = pointeur (A); dst [0] = src; code> à
pointeur (A) [0] = src code>: - |
Ça ne devrait pas; Il est assez facile de faire des erreurs ou d'utiliser accidentellement d'anciennes variables dans une session interactive.
MemMove code> est la bonne opération ici. En définissant le
argtypes code> de votre fonction COPPOpoint, vous pouvez facilement appliquer la sécurité type-sécurité.
<Point: x=1, y=2, addr=3085088024> <Point: x=-1, y=-1, addr=3085087952>
<Point: x=-1, y=-1, addr=3085088024> <Point: x=-1, y=-1, addr=3085087952>
dans Python 3X, votre code peut fonctionner correctement. indiqué ci-dessous:
>>> from ctypes import * >>> class Point(Structure): ... _fields_ = [("x", c_int),("y", c_int)] >>> def copy_point(a, b): ... a.contents = b.contents >>> p0 = pointer(Point()) >>> p1 = pointer(Point(1,2)) >>> p0.contents.x 0 >>> copy_point(p0,p1) >>> p0.contents.x 1
Malheureusement
DeepCopy Code> échoue si la structure CTTYPES contient des pointeurs:
ValueError: Les objets CTTYPES contenant des pointeurs ne peuvent pas être marinés code>.