Списки кодирования в Thrift (Python)
Мне интересно, каков наилучший способ двоичного кодирования списка структур с ThriftPy. Единственный способ, который я нашел, - создать еще одну обертку. struct
и удалите двоичный префикс / суффикс из потока, но это очень странно, и определенно должен быть лучший способ.
foobar.thrift:
struct Object {
1: i32 num1 = 0,
2: i32 num2,
}
struct ListContainer {
1: list<Object> objects
}
app.py
foobar = thriftpy.load('foobar.thrift', module_name="foobar_thrift")
objects = [ ... list of Objects ... ]
thrift_obj = foobar.ListContainer(objects)
trans = TMemoryBuffer()
thrift_obj.write(TBinaryProtocol(trans))
encoded_list = bytes(trans.getvalue())[3:-1]
1 ответ
Я нашел решение... не особо элегантное, но лучше, чем предыдущее.
foobar.thrift:
struct Object {
1: i32 num1 = 0,
2: i32 num2,
}
typedef list<Object> ObjectList
app.py:
import thriftpy
from thriftpy.transport import TMemoryBuffer
from thriftpy.protocol.binary import write_val
foobar = thriftpy.load('foobar.thrift')
def write_list(trans, val, list_type):
ttype, spec = list_type
write_val(trans, ttype, val, spec=spec)
val = [foobar.Object(num1=8, num2=12)]
trans = TMemoryBuffer()
write_list(trans, val, foobar.ObjectList)
encoded_list = bytes(trans.getvalue())
Я попытался увидеть, что делает стандартная реализация Thrift. Это не делает это немного легче. Это ничего не генерирует для ObjectList
поэтому, чтобы достичь того же, вы должны сделать thrift -gen py foobar.thrift
а потом:
app.py:
import sys
sys.path.append('gen-py')
from foobar.ttypes import *
from thrift.protocol import TBinaryProtocol
from thrift.transport import TTransport
def write_list(trans, val):
protocol = TBinaryProtocol.TBinaryProtocol(trans)
protocol.writeListBegin(TType.STRUCT, len(val))
for values in val:
values.write(protocol)
protocol.writeListEnd() # This is a nop
val = [Object(num1=8, num2=12)]
trans = TTransport.TMemoryBuffer()
write_list(trans, val)
encoded_list = trans.getvalue()