Browse Source

TreeLib: Bezpečné varianty .pred a .father_of_first

export_seznamu_prednasek
Pavel 'LEdoian' Turinsky 5 years ago
parent
commit
9a0664f6c2
  1. 27
      seminar/treelib.py

27
seminar/treelib.py

@ -10,24 +10,27 @@ def print_tree(node,indent=0):
if node.succ: if node.succ:
print_tree(node.succ, indent=indent) print_tree(node.succ, indent=indent)
## Rodinné vztahy
def get_parent(node):
pass
# Nejdřív získáme prvního potomka...
# Django je trošku hloupé, takže node.prev nevrací None, ale hází django.core.exceptions.ObjectDoesNotExist # Django je trošku hloupé, takže node.prev nevrací None, ale hází django.core.exceptions.ObjectDoesNotExist
while True: def safe_pred(node):
try: try:
node = node.prev return node.prev
except ObjectDoesNotExist: except ObjectDoesNotExist:
# We rely here on the fact that the assignment will not happen if RHS throws an exception return None
break
# ... a z prvního potomka umíme najít rodiče # A to samé pro .father_of_first
# Django je pořád hloupé... def safe_father_of_first(node):
try: return node.prev
return node.father_of_first
except ObjectDoesNotExist: except ObjectDoesNotExist:
return None return None
## Rodinné vztahy
def get_parent(node):
# Nejdřív získáme prvního potomka...
while safe_pred(node) is not None:
node = safe_pred(node)
# ... a z prvního potomka umíme najít rodiče
return safe_father_of_first(node)
# Obecný next: další Node v "the-right-order" pořadí (já, pak potomci, pak sousedé) # Obecný next: další Node v "the-right-order" pořadí (já, pak potomci, pak sousedé)
def general_next(node): def general_next(node):
# Máme potomka? # Máme potomka?

Loading…
Cancel
Save