.. _bag_book/bag/definitions: Definizioni fondamentali ======================== Vediamo da un punto di vista più tecnico di cosa si costituisce una *Bag* 1. **Bag**: è una collezione (lista) di **BagNode** >>> from gnr.core.gnrbag import Bag >>> mybag = Bag() >>> mybag['andrew']=1 >>> mybag['paul']=2 >>> mybag.nodes [BagNode : andrew at 4526314960, BagNode : paul at 4526315024] >>> mybag.getNodes() [BagNode : andrew at 4526314960, BagNode : paul at 4526315024] 2. **BagNode**: (da ora anche semplicemente *node*) è una classe Genropy che si compone di tre elementi fondamentali. * label * value * attributes Data una bag si può prendere uno dei suoi nodi con il metodo ``getNode`` >>> andrew_node = mybag.getNode('andrew') >>> andrew_node BagNode : andrew at 4526314960 >>> mybag.nodes[0] == andrew_node True 3. **label**: E' la *key* che fa da indirizzo al *BagNode* nella *Bag* che lo contiene. >>> andrew_node.label 'andrew' >>> mybag.keys() ['andrew', 'paul'] 4. **value**: E' il valore che leggiamo/scriviamo quando accediamo alla Bag con la sintassi a parentisi quadre o con i metodi *getItem* *setItem* >>> andrew_node.getValue() 1 >>> mybag.getItem('andrew') 1 >>> mybag['andrew'] 1 5. **attributes**: E' un dizionario nel quale possono essere inseriti dati integrativi riferiti al value al nodo stesso. >>> andrew_node.attr {} >>> andrew_node.attr['birthday']='02/04/1978' >>> andrew_node.attr['birthday'] '02/04/1978' Ma in genere gli attributi vengono inseriti con il nodo stesso utilizzando il metodo ``setItem`` oppure ``setAttr`` e letti con ``getAttr`` >>> mybag.setItem('charles', 3, {'birthday':'05/12/1965'}) >>> mybag.getAttr('charles','birthday') '05/12/1965' >>> mybag.setAttr('paul', birtday='08/14/1989') >>> mybag.getAttr('paul','birthday') '08/14/1989' >>> mybag.setAttr('andrew', height=180, weight=82) >>> mybag.getAttr('andrew') {'birthday': '02/04/1978', 'weight': 82, 'height': 180} >>> andrew_node.attr {'birthday': '02/04/1978', 'weight': 82, 'height': 180} Si chiamano *attributes* perché nella trasposizione XML della bag vengono rappresentati esattamente come attributi. 6. **path**: Quando il value di un BagNode è a sua volta una Bag, ci troviamo di fronte ad una Bag *gerarchica* e per path si intende un indirizzo costituito dalle label di tutti i nodes che devono essere attraversati per raggiungere un dato valore. >>> mybag.setItem('andrew.children.michael', None, birthday='09/07/2004', weigth='30', height='130') .. sectionauthor:: Giovanni Porcari