2016-12-20 5 views
-1

これは私の単一リンクリストの実装です。私は関数を呼び出す場所です__repr____repr__は、リンクされたリストのPythonで実装されています

class SList: 
    def __init__(self): 
     self.root = None 
     self.size = 0 

    def insert(self, item): 
     if not item: 
      raise ValueError('Cannot add None item to a list') 
     self.size += 1 
     if self.root is None: 
      self.root = Node(item) 
     else: 
      p = Node(item) 
      p.next = self.root 
      self.root = p 

    """Remove the element at the specific index""" 

    def remove(self, index): 
     if index < 0 or index >= self.size: 
      raise ValueError('Index cannot be negative or greater than the size of the list') 

     current = self.root 
     if index == 0: 
      self.root = self.root.next 
     else: 
      for _ in range(index - 1): 
       current = current.next 
      p = current.next.next 
      if p is not None: 
       current.next = p 
      else: 
       current.next = None 

     self.size -= 1 

    def __len__(self): 
     return self.size 

    def __repr__(self): 
     "[{}]".format(", ".join(map(str, self))) 

    def __iter__(self): 
     current = self.root 
     while current is not None: 
      yield current 
      current = current.next 


class Node: 
    def __init__(self, data): 
     if data is None: 
      raise ValueError('Node cannot be instantiated without an item') 
     self.data = data 
     self.next = None 

自分を書き込むことによって、印刷方式のカスタム実装をテストしようとしています。

def main(): 
    l = SList() 
    l.insert(12) 
    l.insert(11) 
    l.insert(2) 
    l.insert(21) 
    print(l) 

私ははっきり__repr__方法からフォーマットされた文字列を返すよしかし、私は次のエラー

Traceback (most recent call last): 
     File "/Users/username/Dropbox/code/pydev/data_structures/app.py", line 12, in <module> 
     main() 
     File "/Users/usernamei/Dropbox/code/pydev/data_structures/app.py", line 9, in main 
     print(l) 
    TypeError: __str__ returned non-string (type NoneType) 

を取得しています。私の実装は__iter__で間違っていますか?私はここで間違って何をしていますか?

+3

私は 'が表示されませんそこに戻ります。 – user2357112

答えて

2

returnステートメントがありません。

def __repr__(self): 
    return "[{}]".format(", ".join(map(str, self))) 

明示的に言及しない場合、pythonは返信をNoneとして扱います。

1

あなたは(Noneかもしれないが、Nonestrを実装しているので、問題になることはありません)、それを持っていないNodeオブジェクト、ためstrを呼び出そうとしています。

Nodeクラスに次の行を追加)Nodeため__str__を実装します。

def __str__ (self): 
    return str(self.data) 

また、return(機能をデフォルトでNoneを返す)を追加:

def __repr__(self): 
    return "[{}]".format(", ".join(map(str, self))) 
関連する問題