.. _bag_book/bag/what_is: 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'] 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*:: 24 180 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 .. sectionauthor:: Giovanni Porcari