2016-06-12 4 views
2

Ситуация: Я новичок в python и в настоящее время пытаюсь изучить веревки, я попытался создать класс связанных списков, чтобы помочь лучше понять язык и его структуры. Я знаю, что функция __repr__ в основном должна возвращать то же самое, что и __str__, но я не уверен, какова фактическая разница.Написание метода репрезентации

Вот мой класс до сих пор:

class LinkedList: 
    class Node: 
     def __init__(self, val, prior=None, next=None): 
      self.val = val 
      self.prior = prior 
      self.next = next 

    def __init__(self): 
     self.head = LinkedList.Node(None) 
     self.head.prior = self.head.next = self.head 
     self.length = 0 

    def __str__(self): 
     """Implements `str(self)`. Returns '[]' if the list is empty, else 
     returns `str(x)` for all values `x` in this list, separated by commas 
     and enclosed by square brackets. E.g., for a list containing values 
     1, 2 and 3, returns '[1, 2, 3]'.""" 
     if len(self)==0: 
      return '[]' 
     else: 
      return '[' + ', '.join(str(x) for x in self) + ']' 

    def __repr__(self): 
     """Supports REPL inspection. (Same behavior as `str`.)""" 
     return '[' + ', '.join(str(x) for x in self) + ']' 

Когда я проверить этот код против кода ниже, я получаю сообщение об ошибке в основном говорят, пустую строку «[]» не на самом деле возвращаемой при использовании функция повторения. Как я могу отредактировать тело методов, чтобы исправить эту проблему? Я также пробовал return str(self), и я не уверен, почему это тоже не сработает.

from unittest import TestCase 
tc = TestCase() 

lst = LinkedList() 
tc.assertEqual('[]', str(lst)) 
tc.assertEqual('[]', repr(lst)) 

lst.append(1) 
tc.assertEqual('[1]', str(lst)) 
tc.assertEqual('[1]', repr(lst)) 
+3

* «Я знаю, что функция' __repr__' в принципе должна возвращать то же самое, что и '__str__' * * - Я не знаю, как вы это знаете, но это неправильно, см. Документы в [' __str__ '] (https://docs.python.org/3/reference/datamodel.html#object.__str__) и [' __repr__'] (https://docs.python.org/3/reference/datamodel.html# объект .__ repr__). – jonrsharpe

+0

Код, который вы показали, не может быть запущен как написанный (вы, по крайней мере, оставили методы '__len__' и' __iter__'), что затрудняет его устранение. Хотя мы ценим краткий вопрос, нам нужен [MCVE], который действительно работает! – Blckknght

ответ

2

__repr__ функция возвращает строковое представление объекта Python, которые могут быть оценены с помощью интерпретатора Python для создания экземпляра другого экземпляра объекта. Так что если у вас есть список:

x = ['foo', 'bar'] 

Его __repr__ строка будет:

x_str = repr(x) 
print(x_str) 
>>>> 
"['foo', 'bar']" 

И вы могли бы сделать:

x2 = eval(x_str) 
print(type(x2)) 
>>>> 
<class 'list'> 

Это способ, чтобы получить строковое представление Python объект, который может быть преобразован обратно в новый экземпляр указанного объекта.

В основном разница между __str__ и __repr__ заключается в том, что первая возвращает строковое представление объекта, предназначенного для чтения человеком, а последнее возвращает строковое представление объекта, предназначенного для синтаксического анализа интерпретатором Python. Будьте очень осторожны с этим!

В вашем примере кода оказывается, что __str__ и __repr__ возвращают одинаковое строковое представление. Хорошо. Однако, если вы захотите, вы можете сделать свою __str__ более красивой форматированной версией (например, с возвратом каретки и без скобок), но __repr__ всегда должен возвращать строку, которая может быть проанализирована интерпретатором Python для восстановления объекта.

 Смежные вопросы

  • Нет связанных вопросов^_^