0

文字列を返さない pycurl の READFUNCTION のコールバック関数を作成する方法はありますか? pycurl 経由でバイナリ データのブロックを送信することを計画しています。私はこれを行うコールバック関数を書いてみました:

def read_callback (自己、サイズ):
  データのブロックの場合:
    利回りブロック

しかし、pycurl は、戻り値の型は文字列でなければならないというエラーで終了します。

4

1 に答える 1

1

「読み取り関数」はバイト文字列を返さなければなりません -- 覚えておいてください、libcurl は基礎となる C ライブラリのラッパーです。ただし、それは完全にバイトのバイナリ文字列である可能性があります(2.*少なくともPythonでは-とにかく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 のアイテムが他の種類のバイナリ データ (まだバイト文字列としてエンコードされていない) である場合、たとえばstructやなどの Python ライブラリ モジュールを使用して、それらをバイト文字列に変換できますarray

于 2010-03-06T23:06:13.693 に答える