2013-04-25 3 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__ вернуться другое форматирование в зависимости от типа A:

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 (None) ... –

ответ

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

+0

@ Эрик: исправленный. –

2

В то время как я принял ответ Мартейн, я хотел, чтобы явно показать результаты его предложение немного более ясно:

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