‘NoneType’ object has no attribute ‘value’

when deleting the entire linked list using the “delete_entire(self)” method. It throws no attribute error. Although the above code is running fine. Instead of printing the blank list, it is giving the no attribute error.

class Node:
    def __init__(self,value):
        self.value = value
        self.next = None
    
class CircularSinglyLinkedList:
    def __init__(self):
        self.head = None
        self.tail = None
        
    

    def __iter__(self):
        node = self.head
        
        while True:
            yield node
            if node.next is self.head:
                break
            node = node.next
        
    

    def insertion(self, value, location):
    
        new_node = Node(value)
    
        if self.head is None:
            self.head = new_node
            self.tail = new_node
            self.tail.next = self.head
    
        else:
        
            if location == 0:
            
                new_node.next = self.head
                self.head = new_node
                self.tail.next = new_node
            
            elif location == -1:
                self.tail.next = new_node
                new_node.next = self.head
                self.tail = new_node
            
            else:
            
                temp_node = self.head
                index = 0
                while index < location -1:
                
                    if temp_node.next is self.head:
                        break
                    
                    temp_node = temp_node.next
                    index += 1
            
                next_node = temp_node.next
                temp_node.next = new_node
                new_node.next = next_node
            
                if new_node.next is self.head:
                    self.tail = new_node
               
#---------------------------------------------------------------------------------------------#

    # deleting the entire linked list

    def delete_entire(self):
        self.head = None
        self.tail.next = None
        self.tail = None 




cll = CircularSinglyLinkedList()
cll.insertion(2,1)
cll.insertion(3,2)
cll.insertion(5,3)
cll.insertion(6,4)
cll.insertion(0,0)
cll.insertion(10,-1)
print([node.value for node in call])

output = [0, 2, 3, 5, 6, 10]

cll.delete_entire()
print([node.value for node in call])

AttributeError: ‘NoneType’ object has no attribute ‘value’

The expected output is to be

[ ]

Answer

Your __iter__() method always yields once, even when the list is empty, since it does yield node before checking whether node is None. Whenthe list is empty, that will yield None, and the caller will try to use None.value.

You should stop the loop as soon as node is None.

def __iter__(self):
    node = self.head
    
    while node:
        yield node
        node = node.next