带有列表的 Python 字典,如何在节俭的存根代码中描述它?
Posted
技术标签:
【中文标题】带有列表的 Python 字典,如何在节俭的存根代码中描述它?【英文标题】:Python dictionary with list, how to describe it in a thrift stub code? 【发布时间】:2012-03-15 09:43:45 【问题描述】:我正在尝试发送 python 字典"1": ["2", 3, 4]
。服务器和客户端as here,仅使用TSocket.TServerSocket(unix_socket="socket")
和
TSocket.TSocket(unix_socket="socket")
相应地。该函数返回一个名为get_stats()
的字典。
档案stats.thrift
struct Stat
1: required string login
2: required i32 connections
service Stats
map<string,list<Stat>> get_stats()
生成代码 thrift --gen py stats.thrift
但是当调用该函数时,我在服务器端得到一个错误:
ERROR:root:'str' object has no attribute 'write'
Traceback (most recent call last):
*more text*
File "gen-py/stats/Stats.py", line 189, in write
iter15.write(oprot)
AttributeError: 'str' object has no attribute 'write'
函数write()
def write(self, oprot):
if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
return
oprot.writeStructBegin('get_stats_result')
if self.success is not None:
oprot.writeFieldBegin('success', TType.MAP, 0)
oprot.writeMapBegin(TType.STRING, TType.LIST, len(self.success))
for kiter13,viter14 in self.success.items():
oprot.writeString(kiter13)
oprot.writeListBegin(TType.STRUCT, len(viter14))
for iter15 in viter14:
iter15.write(oprot)
oprot.writeListEnd()
oprot.writeMapEnd()
oprot.writeFieldEnd()
oprot.writeFieldStop()
oprot.writeStructEnd()
thrift 生成代码的原因:
for iter15 in viter14:
iter15.write(oprot)
问题:
为什么为类型 str
调用方法 write()
?
我哪里错了?
在stats.thrift
?
在服务器或客户端代码中?
在thrift --gen
命令中?
【问题讨论】:
【参考方案1】:您的处理程序的返回码似乎有问题。您可能正在放置一个字符串值而不是列表。你能发布你的处理程序代码吗?
【讨论】:
def get_stats(self):
return "1":["2", 3, 4]
@user1271033 那么,你应该返回 `map以上是关于带有列表的 Python 字典,如何在节俭的存根代码中描述它?的主要内容,如果未能解决你的问题,请参考以下文章