gpt4 book ai didi

python thrift union类型不能序列化?

转载 作者:行者123 更新时间:2023-11-28 17:21:41 24 4
gpt4 key购买 nike

我在topic.thrift文件中定义了一个联合类型,生成了gen-py。像这样:

union Generic{
1: string s,
2: bool b,
3: i64 i,
4: double d}

struct Article{
1: string title,
2: string content,
3: Generic test}

和这样的序列化代码:

transport_out = TTransport.TMemoryBuffer()
protocol_out = TBinaryProtocol.TBinaryProtocol(transport_out)
parse_item.write(protocol_out)
bytes = transport_out.getvalue()

parse_item 是 Article 的一个对象:

parse_item = Article()
parse_item.test = 1

不管给parse_item.test赋str,int,bool,double值,我都会得到这样的错误:

Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "gen-py/topic/ttypes.py", line 189, in write
self.test.write(oprot)
AttributeError: 'str' object has no attribute 'write'

我真的不知道为什么?有人有想法吗?

最佳答案

这是一个棘手的问题。问题在于 Python 实现利用了 Python 的动态类型。通过将 int 分配给 parse_item 结构的“test”属性,您可以将其类型更改为“int”(!)。令人惊讶,但仔细想想是明智的。

要获得正确的序列化类型,您需要创建一个通用实例并为其设置测试。

下面是工作代码的演练:

root@154eadaaea91:/ThriftBook/test2# cat un.thrift 
union Generic{
1: string s,
2: bool b,
3: i64 i,
4: double d}

struct Article{
1: string title,
2: string content,
3: Generic test}

root@154eadaaea91:/ThriftBook/test2# thrift -gen py un.thrift
root@154eadaaea91:/ThriftBook/test2# ll
total 20
drwxr-xr-x 3 root root 4096 Dec 22 20:07 ./
drwxr-xr-x 8 root root 4096 Dec 22 19:53 ../
drwxr-xr-x 3 root root 4096 Dec 22 20:07 gen-py/
-rw-r--r-- 1 root root 133 Dec 22 15:46 un.thrift
-rw-r--r-- 1 root root 589 Dec 22 20:07 untest.py
root@154eadaaea91:/ThriftBook/test2# cat untest.py
import sys
sys.path.append("gen-py")

from thrift.transport import TTransport
from thrift.protocol import TBinaryProtocol
from un import ttypes

parse_item = ttypes.Article()
gen = ttypes.Generic()
gen.i = 1
parse_item.test = gen

transport_out = TTransport.TMemoryBuffer()
protocol_out = TBinaryProtocol.TBinaryProtocol(transport_out)
parse_item.write(protocol_out)
bytes = transport_out.getvalue()

transport_in = TTransport.TMemoryBuffer(bytes)
protocol_in = TBinaryProtocol.TBinaryProtocol(transport_in)
dump_item = ttypes.Article()
dump_item.read(protocol_in)
print(dump_item.test.i)
root@154eadaaea91:/ThriftBook/test2# python untest.py
1
root@154eadaaea91:/ThriftBook/test2#

关于python thrift union类型不能序列化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41275354/

24 4 0
文章推荐: python - 同时删除多个列表范围?
文章推荐: python - 具有无序索引的 dask 数据帧会导致静默错误吗?
文章推荐: html - 需要制作3列3行的
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com