[Tutor] Doubly linked list getting "AttributeError: 'NoneType' object has no attribute 'element'"
Sudhier Batara
sudhierb at gmail.com
Tue Sep 22 03:45:28 CEST 2015
Thanks for the reply Steve, I solved it myself.I was not returning 'newest'
Node in parent class.
--sudhier
On Mon, 21 Sep 2015 11:43 pm Steven D'Aprano <steve at pearwood.info> wrote:
> Hi Sudhier, and welcome,
>
> Unfortunately I'm about to step away from the computer, so I can't
> really answer your question in detail, but since it's been 2 or 3 days
> since you asked your question, and I haven't seen any replies at all, I
> thought I'd give a quick reply so you know we aren't ignoring you.
>
> (My inbox is suffering from overload at the moment, so it is possible
> that others have answered your question and I haven't noticed. If so, my
> apologies for wasting everyone's time.)
>
> Regards,
>
>
> Steve
>
> On Sat, Sep 19, 2015 at 07:52:07PM +0530, Sudhier Batara wrote:
> > Hi,
> >
> > I have the below code which is a doubly linked list , which returns
> > the Position of the node rather than the node itself.The code is quite
> > self explanatory.In the below code i call following methods ,
> >
> > p = L.add_last(8)
> > print p.element()
> >
> > the above methods works fine adds the element into the List instance
> > and also printing the element shows the element in the list.
> >
> > But when i call the below methods,
> >
> > q = L.add_after(p,5)
> > q.element()
> >
> > throws following error
> >
> >
> > _______________________________________
> > in make position
> > in make position
> > 8
> > inside validate
> > 8
> > in make position
> > Traceback (most recent call last):
> > File "positional_dlist.py", line 128, in <module>
> > print q.element()
> > File "positional_dlist.py", line 45, in element
> > return self._node.element
> > AttributeError: 'NoneType' object has no attribute 'element'
> > ____________________________________________________
> >
> > Complete code below
> >
> >
> >
> > #!/usr/bin/python
> >
> > class _DoublelinkedBase:
> > class _Node:
> > def __init__(self,element,prev,Next):
> > self.element = element
> > self._prev = prev
> > self._Next = Next
> >
> > def __init__(self):
> > self._header = self._Node(None,None,None)
> > self._trailer = self._Node(None,None,None)
> > self._header._Next = self._trailer
> > self._trailer._prev = self._header
> > self._size = 0
> >
> > def __len__(self):
> > return self._size
> >
> > def is_empty(self):
> > return self._size == 0
> >
> > def _insert_between(self,element,predecessor,successor):
> > newest = self._Node(element,predecessor,successor)
> > predecessor._Next = newest
> > successor._prev = newest
> > self._size += 1
> >
> > def _delete_node(self,node):
> > predecessor = node._prev
> > successor = node._Next
> > predecessor._Next = successor
> > successor._prev = predecessor
> > element = node.element
> > node.element = node._Next = node._prev = None
> > self._size -= 1
> >
> > class PositionalList(_DoublelinkedBase):
> > class Position:
> > def __init__(self,container,node):
> > self._container = container
> > self._node = node
> >
> > def element(self):
> > return self._node.element
> >
> > def __eq__(self,other):
> > return type(other) is type(self) and other._node is
> self._node
> >
> > def __ne__(self,other):
> > return not (other == self)
> >
> > def _validate(self, p):
> > if not isinstance(p,self.Position):
> > raise TypeError("p is not of type Position")
> > if p._container is not self:
> > raise ValueError("p is not the instance of this list")
> > if p._node._Next is None:
> > print p._node
> > raise ValueError("No longer a valid node")
> > print "inside validate"
> > print p.element()
> > return p._node
> >
> > def _make_position(self,node):
> > if node is self._header or node is self._trailer:
> > print "in make position for none"
> > return None
> > else:
> > print "in make position"
> > return self.Position(self,node)
> >
> > def first(self):
> > return self._make_position(self._header._Next)
> >
> > def last(self):
> > return self._make_position(self._trailer._prev)
> >
> > def before(self,p):
> > node = self._validate(p)
> > return self._make_position(node._prev)
> >
> > def after(self,p):
> > node = self._validate(p)
> > return self._make_position(node._Next)
> >
> > def __iter__(self):
> > cursor = self.first()
> > while cursor is not None:
> > yield cursor.element()
> > cursor = self.after(cursor)
> >
> > def _insert_between(self,e,predecessor,successor):
> > #node =
> > super(_DoublelinkedBase,self)._insert_between(e,predecessor,successor)
> > node =
> _DoublelinkedBase()._insert_between(e,predecessor,successor)
> > return self._make_position(node)
> >
> > def add_first(self,e):
> > return self._insert_between(e,self._header,self._header._Next)
> >
> > def add_last(self,e):
> > return self._insert_between(e,self._trailer._prev,self._trailer)
> >
> > def add_before(self,p,e):
> > original = self._validate(p)
> > return self._insert_between(e,original._prev,original)
> >
> > def add_after(self,p,e):
> > original = self._validate(p)
> > return self._insert_between(e,original,original._Next)
> >
> > def delete_node(self,p):
> > original = self._validate(p)
> > return self._delete_node(original)
> >
> > def replace(self,p,e):
> > original = self._validate(p)
> > old_value = original.element
> > original.element = e
> > return old_value
> >
> >
> > L = PositionalList()
> > p = L.add_last(8)
> > p = L.first()
> > print p.element()
> > q = L.add_after(p,5)
> > print q.element()
> > _______________________________________________
> > Tutor maillist - Tutor at python.org
> > To unsubscribe or change subscription options:
> > https://mail.python.org/mailman/listinfo/tutor
> >
>
More information about the Tutor
mailing list