मैं ctypes के साथ अजगर में सी कोड का एक टुकड़ा की नकल करना चाहते हैं, कोड कुछ की तरह है:अजगर ctypes: प्रतिलिपि बनाई जा रही संरचना की सामग्री
typedef struct {
int x;
int y;
} point;
void copy_point(point *a, point *b) {
*a = *b;
}
ctypes यह संभव नहीं है में करने के लिए निम्नलिखित:
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)
contents
के रूप में अभी भी एक पाइथन ctypes संरचना वस्तु है, जिसे संदर्भ के रूप में प्रबंधित किया जाता है।
एक स्पष्ट कामकाज प्रत्येक क्षेत्र को मैन्युअल रूप से प्रतिलिपि बनाना होगा (जिसे अपरिवर्तनीय पायथन इंट के रूप में दर्शाया गया है), लेकिन यह अधिक जटिल संरचनाओं के साथ स्केल नहीं करता है। इसके अलावा, इसे उन क्षेत्रों के लिए पुनरावर्ती रूप से किया जाना चाहिए जो बुनियादी नहीं हैं, बल्कि संरचित प्रकार हैं।
मेरे अन्य विकल्प memmove
का उपयोग करें और वस्तुओं कॉपी रूप में यदि वे बफ़र्स थे करने के लिए है, लेकिन जैसा कि अजगर गतिशील रूप से लिखा गया यह अलग प्रकार और आकार की वस्तुओं के साथ इसका इस्तेमाल करने के लिए बहुत आसान होती है कि बहुत त्रुटियों की संभावना लगता है (, प्रमुख स्मृति भ्रष्टाचार या विभाजन दोषों के लिए) ...
कोई सुझाव?
संपादित:
मैं भी संरचना के एक ताजा नई प्रतिलिपि इस्तेमाल कर सकते हैं, तो हो सकता है यह उपयोगी हो सकता है:
import copy
p0 = Point()
p1 = copy.deepcopy(p0) #or just a shallow copy for this example
लेकिन मैं अगर वहाँ किसी तरह का हो सकता है पता नहीं है के विचित्र व्यवहार ctypes proxys को कॉपी रूप में यदि वे नियमित रूप से अजगर वस्तुओं थे ...
दुर्भाग्य से 'deepcopy' विफल रहता है ctypes संरचना संकेत शामिल हैं:' ValueError: ctypes संकेत युक्त वस्तुओं pickled' नहीं किया जा सकता। – 101