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