node.py 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. # vim: set fileencoding=utf-8 :
  2. from copy import deepcopy
  3. class Node(object):
  4. def __init__(self, value, *nodes):
  5. super(Node, self).__init__()
  6. self.value, self.nodes = value, list(nodes)
  7. self.is_leaf = False
  8. self.negated = 0
  9. def __getitem__(self, n):
  10. return self.nodes[n]
  11. def __setitem__(self, n, node):
  12. self.nodes[n] = node
  13. def __iter__(self):
  14. return iter(self.nodes)
  15. def __len__(self):
  16. return len(self.nodes)
  17. def __eq__(self, node):
  18. return isinstance(node, Node) \
  19. and self.value == node.value and self.nodes == node.nodes
  20. def __neg__(self):
  21. copy = deepcopy(self)
  22. copy.negated += 1
  23. return copy
  24. def __str__(self):
  25. return '<Node value=%s nodes=%s>' % (str(self.value), str(self.nodes))
  26. def title(self):
  27. return str(self.value)
  28. class Leaf(Node):
  29. def __init__(self, value):
  30. super(Leaf, self).__init__(value)
  31. self.value = value
  32. self.nodes = None
  33. self.is_leaf = True
  34. def __len__(self):
  35. return len(str(self.value))
  36. def __repr__(self):
  37. return repr(self.value)
  38. def __str__(self):
  39. return str(self.value)