سؤال

هل هناك طريقة لكتابة وظيفة رد الاتصال من أجل إعادة قراءة 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.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top