文字列を返さない pycurl の READFUNCTION のコールバック関数を作成する方法はありますか? pycurl 経由でバイナリ データのブロックを送信することを計画しています。私はこれを行うコールバック関数を書いてみました:
def read_callback (自己、サイズ): データのブロックの場合: 利回りブロック
しかし、pycurl は、戻り値の型は文字列でなければならないというエラーで終了します。
「読み取り関数」はバイト文字列を返さなければなりません -- 覚えておいてください、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
。