voglio imitare un pezzo di codice C in Python con ctypes, il codice è qualcosa di simile:Python ctypes: il contenuto di Struttura copiare
typedef struct {
int x;
int y;
} point;
void copy_point(point *a, point *b) {
*a = *b;
}
in ctypes Non è possibile effettuare le seguenti operazioni:
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)
come contents
è ancora un oggetto Python ctypes Structure, gestito come riferimento stesso.
Una soluzione ovvia sarebbe quella di copiare manualmente ogni campo (che è rappresentato come immutable python int), ma che non scala con strutture più complesse. Inoltre, dovrebbe essere eseguito in modo ricorsivo per i campi che non sono di base, ma tipi strutturati.
La mia altra opzione è utilizzare memmove
e copiare gli oggetti come se fossero buffer, ma questo sembra molto soggetto a errori (poichè Python è digitato dinamicamente sarebbe troppo facile usarlo con oggetti di tipo e dimensione distinti, che conducono alla memoria difetti di corruzione o segmentazione) ...
Qualche suggerimento?
Edit:
Potrei anche usare una nuova copia fresca della struttura, quindi forse questo potrebbe essere utile:
import copy
p0 = Point()
p1 = copy.deepcopy(p0) #or just a shallow copy for this example
ma non so se ci potrebbe essere qualche tipo di comportamenti bizzarri copiando ctypes proxy come se fossero oggetti Python regolari ...
Sfortunatamente 'deepcopy' ha esito negativo se la struttura ctypes contiene puntatori:' ValoreErrore: gli oggetti di tipo ctypes contenenti puntatori non possono essere sottoposti a pickled'. – 101