Path all’indietro

Abbiamo detto che la bag è una collezione di nodi raggiungibili grazie ad un indirizzo “”path”” costituito dalle “”label”” dei nodi stessi, concatenate da punti. Questo significa che ciascunoa Bag può raggiungere tutti gli elementi contenuti al suo interno, ma una Bag interna non può raggiungere alcun elemento al suo esterno.

Cioè dalla Bag città posso specificare il path via.civico.scala.piano.appartamento.cucina, ma dalla bag piano non posso accedere ad altri elementi al di fuori. Inoltre una Bag può in realtà avere più di un padre, infatti…

>>> andrew_bag = Bag(dict(fname='Andrew', age='24', height='180'))
>>> john_bag = Bag(dict(fname='John', age='50', height='175'))
>>> john_bag.setItem('sons.first_son', andrew_bag)
>>> print john_bag
0 - (str) age: 50
1 - (str) fname: John
2 - (str) height: 175
3 - (Bag) sons:
    0 - (Bag) first_son:
        0 - (str) age: 24
        1 - (str) fname: Andrew
        2 - (str) height: 180
>>> claire_bag = Bag(dict(fname='Claire', age='49', height='166'))
>>> claire_bag.setItem('sons.first_son', andrew_bag)
>>> print claire_bag
0 - (str) age: 49
1 - (str) fname: Claire
2 - (str) height: 166
3 - (Bag) sons:
    0 - (Bag) first_son:
        0 - (str) age: 24
        1 - (str) fname: Andrew
        2 - (str) height: 180

In questo caso da andrew_bag come potremmo sapere qual è il suo elemento parent che lo contiene?

BackRef

Per questo stato definito il metodo setBackRef che permette di specificare che a partire da una certa bag, quella sarà la radice di una struttura ad albero coerente in cui ogni foglia conosce (ed ha una reveferenza) verso il suo elemento padre. E questo permette di percorrere una Bag anche dalle foglie verso la radice usando la proprietà parent.

>>> family = Bag()
>>> family['grandpa'] = Bag()
>>> family['grandpa'].setBackRef()
>>> family['grandpa.father.son.nephew']=Bag()
>>> nephew = family['grandpa.father.son.nephew']
>>> son = family['grandpa.father.son']
>>> father = family['grandpa.father']
>>> son.parent == father
True
>>> nephew.parent.parent == father
True
>>> nephew.parent == son
True

Una Bag sulla quale si sono attivate le BackRef supporta degli speciali path all’indietro: Il simbolo ../ equivale alla proprietà parent.

>>> nephew['../../'] == father
True