Je veux imiter un morceau de code C en Python avec ctypes, le code est quelque chose comme:Python ctypes: le contenu de la copie Structure
typedef struct {
int x;
int y;
} point;
void copy_point(point *a, point *b) {
*a = *b;
}
dans ctypes il est impossible de faire ce qui suit:
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())
copy_point(p0,p1)
comme le contents
est toujours un objet structure Python ctypes, qui est géré comme une référence elle-même.
Une solution de contournement évidente consisterait à copier manuellement chaque champ (qui est représenté par un int de python immuable), mais cela ne s'applique pas aux structures plus complexes. En outre, il devrait être fait récursivement pour les champs qui ne sont pas de base, mais les types structurés.
Mon autre option est d'utiliser memmove
et de copier les objets comme s'ils étaient des tampons, mais cela semble très sujet aux erreurs (comme Python est dynamiquement typé, il serait trop facile de l'utiliser avec des objets de type et de taille distincts, à la mémoire de la corruption ou des fautes de segmentation) ...
Des suggestions?
Modifier:
Je pourrais aussi utiliser une nouvelle nouvelle copie de la structure, alors peut-être cela pourrait être utile:
import copy
p0 = Point()
p1 = copy.deepcopy(p0) #or just a shallow copy for this example
mais je ne sais pas s'il pourrait y avoir une sorte des comportements bizarres copiaient ctypes proxys comme si elles étaient des objets Python réguliers ...
Malheureusement, 'deepcopy' échoue si la structure ctypes contient des pointeurs:' ValueError: les objets ctypes contenant des pointeurs ne peuvent pas être décapés'. – 101