node.py 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. # vim: set fileencoding=utf-8 :
  2. from copy import deepcopy
  3. class Node(object):
  4. def __init__(self, value, *nodes, **kwargs):
  5. super(Node, self).__init__()
  6. self.value, self.nodes = value, list(nodes)
  7. self.is_leaf = False
  8. self.negated = kwargs.get('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) and self.value == node.value \
  19. and self.nodes == node.nodes
  20. def __neg__(self):
  21. copied = deepcopy(self)
  22. copied.negated += 1
  23. return copied
  24. def __str__(self):
  25. return '<Node value=%s nodes=%s negated=%d>' \
  26. % (str(self.value), str(self.nodes), self.negated)
  27. def __repr__(self):
  28. return self.__str__()
  29. def title(self):
  30. return str(self.value)
  31. class Leaf(Node):
  32. def __init__(self, value, **kwargs):
  33. super(Leaf, self).__init__(value, **kwargs)
  34. self.value = value
  35. self.nodes = None
  36. self.is_leaf = True
  37. def __len__(self):
  38. return len(str(self.value))
  39. def __str__(self):
  40. return '-' * self.negated + str(self.value)
  41. def __repr__(self):
  42. return '<Leaf %s>' % repr(str(self))