Списки кодирования в 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()
Другие вопросы по тегам