Как распечатать список, словарь или коллекцию объектов в Python

Я написал класс на Python, который реализует __str__(self), но когда я использую печать в списке, содержащем экземпляры этого класса, я просто получаю результат по умолчанию <__main__.DSequence instance at 0x4b8c10>. Есть ли еще одна волшебная функция, которую мне нужно реализовать, чтобы это работало, или мне нужно написать собственную функцию печати?

Вот класс:

class DSequence:

    def __init__(self, sid, seq):
        """Sequence object for a dummy dna string"""
        self.sid = sid
        self.seq = seq

    def __iter__(self):
        return self

    def __str__(self):
        return '[' + str(self.sid) + '] -> [' + str(self.seq) + ']'

    def next(self):
        if self.index == 0:
            raise StopIteration
        self.index = self.index - 1
        return self.seq[self.index]

person Dana the Sane    schedule 17.05.2009    source источник


Ответы (2)


Да, вам нужно использовать __repr__. Краткий пример его поведения:

>>> class Foo:
...     def __str__(self):
...             return '__str__'
...     def __repr__(self):
...             return '__repr__'
...
>>> bar = Foo()
>>> bar 
__repr__
>>> print bar 
__str__
>>> repr(bar)
'__repr__'
>>> str(bar)
'__str__'

Однако, если вы не определите __str__, он вернется к __repr__, хотя это не рекомендуется:

>>> class Foo:
...     def __repr__(self):
...             return '__repr__'
...
>>> bar = Foo()
>>> bar
__repr__
>>> print bar
__repr__

Учитывая все обстоятельства, как рекомендует руководство, __repr__ используется для отладки и должен возвращать что-то reprпредставитель объекта.

person Paolo Bergantino    schedule 17.05.2009
comment
Стоит ли соответствовать тому, что говорится в руководстве. Если это вообще возможно, это должно выглядеть как допустимое выражение Python, которое можно было бы использовать для воссоздания объекта с тем же значением (в соответствующей среде). Так что-то вроде DSequence (1, 'GTTAC')? - person Dana the Sane; 17.05.2009
comment
Хорошо, я также нашел этот q для того, чтобы stackoverflow.com/questions/452300/ Спасибо за вашу помощь. - person Dana the Sane; 17.05.2009
comment
Кстати, почему контейнеры используют repr () для печати элементов? Следует ли мне использовать его и для моих собственных контейнеров? - person Bastien Léonard; 17.05.2009

Просто небольшое улучшение, избегающее + для конкатенации:

def __str__(self):
  return '[%s] -> [%s]' % (self.sid, self.seq)
person odwl    schedule 17.05.2009