chcę naśladować kawałek kod C w Pythonie z ctypes, kod jest coś takiego:Python ctypes: Treść Kopiowanie struktura jest
typedef struct {
int x;
int y;
} point;
void copy_point(point *a, point *b) {
*a = *b;
}
w ctypes nie jest możliwe, aby wykonać następujące czynności:
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)
jako contents
nadal jest obiektem typu Python ctypes Structure, który jest zarządzany jako sam odnośnik.
Oczywistym obejściem byłoby ręczne skopiowanie każdego pola (reprezentowanego przez niezmienny python int), ale nie skaluje się przy bardziej złożonych strukturach. Ponadto należy wykonać rekursywnie dla pól, które nie są typami podstawowymi, ale strukturalnymi.
Moją drugą opcją jest użycie memmove
i skopiowanie obiektów tak, jakby były buforami, ale wydaje się to bardzo podatne na błędy (ponieważ Python jest wpisywany dynamicznie, byłoby zbyt łatwo używać go z obiektami o różnych typach i rozmiarach, prowadząc do uszkodzenia pamięci lub błędów segmentacji) ...
Jakieś sugestie?
Edit:
mogę też użyć świeżego nową kopię struktury, więc może ta może być przydatna:
import copy
p0 = Point()
p1 = copy.deepcopy(p0) #or just a shallow copy for this example
ale nie wiem, czy może istnieć jakiś rodzaj od zachowania dziwaczne kopiowanie ctypes Proxys jakby były zwykłymi obiektów Pythona ...
Niestety 'deepcopy' zawiedzie, jeśli struktura ctypes zawiera wskaźniki:' ValueError: ctypes obiekty zawierające wskaźniki nie mogą być wytrawione. – 101