【问题标题】:__repr__() returned non-string__repr__() 返回非字符串
【发布时间】:2012-11-23 09:57:32
【问题描述】:

所以我有一个类方法,我想用它来绘制字典及其值:

 def __repr__ (self): 
        for row in zip(*([ky]+map(str,val) for ky,val in (self.slovar.items()))):

           print"\t".join (row)

如果是这样,我会得到想要的输出:

>>> test
n   n1  n2
1   a   2.3
2   b   2.1
3   d   2.5

Traceback (most recent call last):
  File "<pyshell#521>", line 1, in <module>
    test
TypeError: __repr__ returned non-string (type NoneType)

还有一个 Traceback 错误。

如果我返回值而不是打印出来,我只会得到这个:

>>> test
n   n1  n2

如果我制作一个自定义方法而不是默认的“系统”方法,它会正常工作......(我需要它是默认的)

【问题讨论】:

  • 您不应该在您的__repr__ 中使用printing。

标签: python string traceback repr


【解决方案1】:

您的__repr__(self) 方法必须返回一个字符串:

def __repr__ (self): 
 return "\n".join("\t".join (row) for row in zip(*([ky]+map(str,val) for ky,val in (self.slovar.items()))))

【讨论】:

    【解决方案2】:

    你可以这样做:

    def __repr__ (self): 
        rows = zip(*([ky]+map(str,val) for ky,val in (self.slovar.items())))
        return "\n".join("\t".join(row) for row in rows)
    

    这样它保持可读性和紧凑性。

    【讨论】:

      【解决方案3】:

      您的__repr__ 方法使用print 输出信息,但没有return 语句,因此它实际上返回了None,它不是字符串。


      你可以做的是:

      def __repr__ (self): 
          parts = []
          for row in zip(*([ky]+map(str,val) for ky,val in (self.slovar.items()))):
             parts.append("\t".join (row))
          return '\n'.join(parts)
      

      您可能还想看看the pprint module

      【讨论】:

      • 是的,我知道。如果我返回而不是打印,我只会得到字典键名,而没有项目......
      • @user1509923 我添加了一个示例,说明如何实际返回某些内容
      猜你喜欢
      • 2015-08-18
      • 2016-01-18
      • 2015-03-01
      • 2023-01-13
      • 1970-01-01
      • 2014-05-19
      • 2020-09-15
      • 2018-03-02
      • 1970-01-01
      相关资源
      最近更新 更多