带有列表的 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>` 形式的东西。但您没有返回 Stats 对象列表 - 而是字符串和整数的混合列表。 thrift 不能序列化这个。

以上是关于带有列表的 Python 字典,如何在节俭的存根代码中描述它?的主要内容,如果未能解决你的问题,请参考以下文章

关于节俭函数返回列表

如何将带有嵌套字典的列表写入 csv 文件?

带有存根的子类的 Python 2.7 类型提示

Python:带有字符串列表和子字典的嵌套字典

减少python中字典上带有关键字参数的函数列表

python 字典|列表用法