.. _bag_book/bag/backward: 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 .. sectionauthor:: Giovanni Porcari