سؤال

تحرير: عند إعادة قراءة سؤالي الأصلي، أدركت بسرعة كبيرة بأنها كانت سيئة للغاية، غامضة، مربكة للغاية في الحصول على إجابة لائقة. هذا ما أحصل عليه للتسرع في سؤال في نهاية استراحة الغداء. نأمل أن يكون هذا أكثر وضوحا:

أحاول عرض هيكل جيم بسيط إلى Python (3.x) كأزواج حتى أتمكن من استرداد MemoryView منه. الهيكل الذي أريد عرضه يشبه هذا:

struct ImageBuffer {
    void* bytes;
    int row_count;
    int bytes_per_row;
};

وهي رغبتي في السماح لكاتب البرنامج النصي بالوصول إلى البيانات مثل ذلك:

img_buffer = img.get_buffer()
img_buffer[1::4] = 255 # Set every Red component to full intensity

لسوء الحظ، فإن الوثائق الحالية حول واجهة برمجة تطبيقات C لهذه الهياكل هي متناثرة، متناقضة ذاتيا في الأماكن، وخطأ صحيح في الآخرين (توقيعات الوظائف الموثقة لا تتطابق مع تلك الموجودة في الرؤوس، وما إلى ذلك) على هذا النحو، ليس لدي جيدة جدا فكرة عن كيفية تعريض هذا أفضل هذا. وأود أيضا أن أتجنب بما في ذلك Libs الطرف الثالث لتحقيق الوظائف التي يجب أن تكون جزءا من LIBs الأساسي، لكنها تشعر بي مثل وظائف حزب الشعيبات لا تزال غير ناضجة إلى حد ما، وربما شيء مثل Numpy سيكون اختيار أفضل.

هل لديها أي نصيحة على هذا؟

هل كانت مفيدة؟

المحلول

مجموعة الطرق التي يجب تنفيذها بحيث يدعم نوع التمديد الخاص بك بروتوكول المخزن المؤقت هنا: http://docs.python.org/3.1/c-api/typeobj.html#buffer-object- تنصية

أدرك أن الوثائق صعبة للغاية، وبالتالي فإن أفضل نصيحة يمكنني تقديمها هي البدء من تطبيق موجود ل API العازلة من قبل نوع C، على سبيل المثال bytesobject.c أو bytearrayobject.c في التعليمات البرمجية الرسمية لبثون الرسمية.

ومع ذلك، يرجى ملاحظة أن البروتوكول المخزن المؤقت لا يمنح الوصول إلى علامات رفيعة المستوى مثل التي نقلت عنها: img_buffer[1::4] = 255 لن تعمل على كائن MemoryView.

يحرر: أن تكون أكثر دقة، تدعم MyMyViews بعض أنواع الواجبات الشريحة، ولكن ليس كلها. أيضا، فهي ليست "ذكية" بما يكفي لفهم أن تعيين 255 إلى شريحة يعني في الواقع أنك تريد أن تتكرر قيمة البايت. مثال:

>>> B = ByTearray (B "ABCD") >>> M = MemoryView (B) >>> M [0: 2] = B "XY" >>> B bytearray (b'xycd ') >>> [0: 2] = 255 Traceback (أحدث المكالمة الأخيرة): ملف "" "" "" "" "، السطر 1، في TypeError: 'INT' لا يدعم واجهة المخزن المؤقت >>> M [0: 2] = B" X "Traceback ( آخر مكالمة آخر مرة): ملف "" "" "" "" "" "" "، السطر 1، في ValueError: لا يمكن تعديل حجم كائن MemoryView >>> M [0 :: 2] = B" XY "Traceback (أحدث المكالمة الأخيرة): ملف" "" 1، في notimplementederror
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top