que quiero imitar una pieza de código C en Python con ctypes, el código es algo como:ctypes Python: contenidos copia de Estructura
typedef struct {
int x;
int y;
} point;
void copy_point(point *a, point *b) {
*a = *b;
}
en ctypes no es posible hacer lo siguiente:
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)
como contents
todavía es un objeto de estructura de Python ctypes, que se gestiona como una referencia.
Una solución obvia sería copiar manualmente cada campo (que se representa como int inmutable python), pero eso no escala con estructuras más complejas. Además, tendría que hacerse recursivamente para campos que no son básicos, sino tipos estructurados.
Mi otra opción es usar memmove
y copiar los objetos como si fueran almacenamientos intermedios, pero eso parece muy propenso a errores (ya que Python está tipeado dinámicamente sería demasiado fácil de usar con objetos de distinto tipo y tamaño, a corrupción de memoria o fallas de segmentación) ...
¿Alguna sugerencia?
Editar:
También podría utilizar una nueva copia nueva de la estructura, así que quizás esto podría ser útil:
import copy
p0 = Point()
p1 = copy.deepcopy(p0) #or just a shallow copy for this example
pero no sé si podría haber algún tipo de comportamientos extraños copiando ctypes proxys como si fueran objetos de Python regulares ...
Desafortunadamente 'deepcopy' falla si la estructura de los tipos contiene punteros:' ValueError: los objetos de tipo ctypes que contienen punteros no se pueden conservar en escabeche'. – 101