Cos’è una Bag

Bag è una classe di Genropy usata per creare strutture dati versatili dai molteplici impieghi. È l’ideale per rappresentare, immagazzinare e permettere l’accesso ad un insieme di dati complesso e gerarchico. Una Bag permette di scrivere e leggere velocemente valori usando una key e la notazione con parentesi quadre, come se fosse un dizionario.

>>> from gnr.core.gnrbag import Bag
>>> mybag = Bag()
>>> mybag['fname'] = 'John'
>>> mybag['fname']
'John'

key in Bag è anche chiamata label.

Dal momento che abbiamo detto che è anche una struttura gerarchica vedremo ora che è possibile scrivere e leggere valori usando un path invece che una semplice key. Un path è costituito dalle label delle bag attraversate, concatenate da punti:

>>> mybag = Bag()
>>> mybag['person.age'] = 24
>>> mybag['person.height'] = 190
>>> mybag['person.age']
24

mybag è una bag il cui valore è la bag mybag['person'] è a sua volta una bag che contiene mybag['person.age'] la quale contiene un valore integer. Potremmo dire che è una sorta di struttura frattale e tutte le bag intermedie, come person sono generate automaticamente quando un valore è inserito usando un path gerarchico.

>>> mybag['person']
<gnr.core.gnrbag.Bag object at 0x10ffef890>

La classe Bag implementa alcune caratteristiche del Dictionary:

  • Entrambe, Bag e Dictionary, sono costituite da un set di coppie key:value.
  • I valori sono letti tramite una key (che nella bag viene chiamata label se piatta o path se gerarchica).
  • Entrambe, Bag e Dictionary, possono ridursi o crescere secondo necessità.
  • Entrambe, Bag e Dictionary, possono essere annidate le une dentro le altre.
  • Bag implementa alcuni metodi di Dictionary ad esempio keys(), items(), values()

Alcune differenze

Dictionary Bag
Oggetto mutabile di coppie key:value Oggetto immutabile di coppie key:value
Non gerarchico Gerarchica
Non ordinato Ordinata
La chiave deve essere univoca La chiave è replicabile

In termini molto semplici si può dire che una Bag può essere vista come un oggetto rappresentante un frammento XML in cui i tag sono le label:

<?xml version='1.0' encoding='UTF-8'?>
<GenRoBag>
<person> <age>24</age> <height>180</height></person>
</GenRoBag>

Stampare una bag

Se si vuole avere una rappresentazione stampata di una Bag e del suo contenuto basta invocare la primitiva print:

>>> print mybag
0 - (Bag) person:
0 - (int) age: 24
1 - (int) height: 190

Un altro modo è usare il metodo di Bag asString

>>> mybag.asString()
0 - (Bag) person:
0 - (int) age: 24
1 - (int) height: 190