pycurl readfunction مع bytestream
سؤال
هل هناك طريقة لكتابة وظيفة رد الاتصال من أجل إعادة قراءة Pycurl التي لا تُرجع سلسلة؟ أخطط لإرسال كتل من البيانات الثنائية عبر Pycurl. حاولت كتابة وظيفة رد الاتصال تقوم بذلك:
def read_callback(self, size): for block in data: yield block
لكن Pycurl يخرج بخطأ يقول أن نوع الإرجاع يجب أن يكون سلسلة.
المحلول
يجب أن تُرجع "وظيفة القراءة" سلسلة من البايتات-تذكر أن libcurl عبارة عن غلاف على مكتبة C الأساسية ، لذلك بالطبع فهي من النوعية!-). ومع ذلك ، يمكن أن تكون سلسلة ثنائية من البايتات (في بيثون 2.*
على الأقل - لا أعتقد أن Pycurl يعمل مع Python 3 على أي حال) ، لذلك بالطبع يمكنه إرجاع "كتل من البيانات الثنائية" - طالما تم ترميزها في سلاسل من البايتات واحترام size
قيد.
ما قمت بترميزه للتو ، عند استدعاءه ، يعيد "وظيفة المولد" - من الواضح أنه ليس جيدًا. على افتراض data
هي قائمة بسلاسل البايت غير الفارغة ، تحتاج إلى الزهر وتقطيعها بشكل مناسب ، والعودة في كل مرة return
, ، بالتااكيد ليس yield
(!).
لست متأكدًا من أين هذا الغامض data
يأتي من لك - لنفترض أنك تعني self.data
في حين أن. ثم تحتاج إلى تتبع ، في متغيرات مثيل أخرى ، من الفهرس الحالي إلى self.data
وربما - إذا كانت العناصر أطول من size
- من "الجزء غير المجهول" من القطعة الحالية أيضًا.
على سبيل المثال ، يمكن أن يكون:
class MySender(object):
def __init__(self, data):
self.data = data
self.i = 0
self.rest = 0
def readfunction(self, size):
if self.i >= len(self.data):
return ''
result = self.data[self.i][self.rest:self.rest+size]
self.rest += size
if self.rest >= len(self.data[self.i]):
self.i += 1
self.rest = 0
إذا كانت عناصر self.data هي أنواع أخرى من البيانات الثنائية (غير مشفرة بالفعل كسلاسل بايت) ، فيمكنك تحويلها إلى سلاسل بايت على سبيل المثال بمساعدة من وحدات مكتبة Python مثل struct
و array
.