2013-04-25 77 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) 
相关问题