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')