__repr__()返回了非字符串

6

我有一个类方法,想要提取字典及其值:

 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

如果我使用自定义方法而不是默认的“系统”方法,则可以正常工作…(但我需要它成为默认值)


2
你不应该在__repr__内部使用 print - Waleed Khan
3个回答

12
您的__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)

您可能还想查看 pprint模块

是的,我知道。如果我使用return而不是print,我只能得到字典的键名,没有值... - user1509923
1
@user1509923 我添加了一个示例,展示了你如何实际返回某些内容。 - Thomas Orozco

2

您的__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()))))

1
你可以这样做:
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)

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接