2013-04-25 91 views
0

鑑於這種簡單的類:__repr__是否可以是字符串或None的屬性?

class Foo(object): 
    def __init__(self,a=None): 
     self.a = a 
    def __repr__(self): 
     return "Foo(a='{self.a}')".format(self=self) 

我想知道如果有一個簡單的方法來獲得__repr__取決於的類型返回不同的格式:

Foo('some_string') # if a is a string 
Foo(5)    # if a is the integer 5 
Foo(None)   # if a is None 

顯然,對於一個我可以測試單個屬性,並有不同的輸出字符串,但我認爲有人必須在我之前解決這個問題。具體來說,我有幾個屬性可以是字符串或無,並且我沒有看到爲我的__repr__編寫複雜的邏輯很有意義。

+0

感謝的Martijn的快速解答!現在,有沒有人有處理可選參數的「技巧」?我認爲Foo()比Foo(無)漂亮很多...... – 2013-04-25 22:15:57

回答

3

只需使用repr()self.a的:

return "Foo(a={self.a!r})".format(self=self) 

!r告訴.format()調用repr()self.a,而不是在值調用__format__(),看到Format String syntax

>>> '{!r}'.format(0) 
'0' 
>>> '{!r}'.format('foo') 
"'foo'" 

演示:

>>> Foo(0) 
Foo(a=0) 
>>> Foo('foo') 
Foo(a='foo') 
>>> Foo(None) 
Foo(a=None) 
+0

你可能想把引號放到'「Foo(a = {self.a!r})」' – Eric 2013-04-25 21:52:46

+0

@Eric:的確,糾正。 – 2013-04-25 21:54:25

2

雖然我接受的Martijn的答案,我想明確地表明他的建議的結果多一點明確:

>>> class Foo(object): 
...  def __init__(self, a=None, b=None): 
...   self.a = a 
...   self.b = b 
...  def __repr__(self): 
...   return 'Foo(a={self.a!r}, b={self.b!r})'.format(self=self) 
...  
>>> Foo(a='a') 
Foo(a='a', b=None) 
>>> Foo(a=5) 
Foo(a=5, b=None) 
相關問題