__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

Очевидно, что для одного атрибута я мог бы протестировать и иметь разные выходные строки, но я думаю, что кто-то должен был заняться этим до меня. В частности, у меня есть несколько атрибутов, которые могут быть строками или None, и я не вижу, что написание сложной логики для моего __repr__ имеет много смысла.

2 ответа

Решение

Просто используйте repr() из self.a:

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

!r говорит .format() звонить repr() на self.aвместо звонка __format__() значение смотрите в разделе Синтаксис Format String:

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

Демо-версия:

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

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

>>> 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)
Другие вопросы по тегам