2012-12-05 92 views
1

所以我有,我想繪製出字典類方法,它的值:__repr __()返回非字符串

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 

,如果我做一個自定義的方法不是默認的「系統」之一,它工作正常...(我需要它是默認)

+1

你不應該在你的'__repr__'裏面'打印'。 –

回答

7

__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

+0

是的,我知道。如果我返回而不是打印,我只得到字典的關鍵名稱,並沒有項目... – user1509923

+1

@ user1509923我添加了一個例子,你如何可以實際返回 –

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())))) 
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) 

這樣,它仍然是可讀的,緊湊。

+0

非常感謝! – user1509923