Le Structures in Genropy

La classe GnrStructData eredita da Bag e permette di definire attraverso appositi metodi descrittori realtà complesse composte da collezioni di entità innestate (es: HTML, XML, DB model, GUI).

Il metodo più importante di GnrStructData è child, che di fatto è un altro modo di fare una setItem su una Bag.

from gnr.core.gnrstructures import GnrStructData

mystruct = GnrStructData()
mystruct.child(tag='ingrediente',nome='Spaghetti', peso='200g')
mystruct.child(tag='ingrediente',nome='Salsa', peso='100g')

f = mystruct.child(tag='fase', nome='Preparare sugo', t=’10 min.')
f.child(tag='fase', nome='Tagliare cipolla')
f.child(tag='fase', nome='Soffriggere cipolla')
f.child(tag='fase', nome='Aggiungere salsa')

La child equivale ad una setItem ad un path prefissato basato sull’attributo tag. Inoltre restituisce l’oggetto appena aggiunto.

from gnr.core.gnrstructures import GnrStructData

class Ricetta(GnrStructData):

   def ingrediente(self, nome, peso):
       return self.child(tag='ingrediente', nome=nome, peso=peso)

   def fase(self, nome, descrizione=None, tempo=None):
       return self.child(tag='fase', nome=nome, tempo=tempo, descrizione=descrizione)

   def sezione(self, nome):
       return self.child(tag='sezione', nome=nome)

Definire questi metodi serve anche a scopo documentativo e permette un controllo dei parametri rispetto, rispetto all’uso di una Bag «libera».

def main():
    myricetta = Ricetta()
    ingr = myricetta.sezione('Ingredienti')
    ingr.ingrediente('Spaghetti', '100g')
    ingr.ingrediente('Salsa pomodoro', '80g')
    procedimento = myricetta.sezione('Procedimento')
    sughetto = procedimento.fase(nome='Preparare sugo', tempo='15 min')
    sughetto.fase(nome='Tagliare cipolla')
    sughetto.fase(nome='Soffriggere cipolla', tempo='3 min')
    sughetto.fase(nome='Aggiungere salsa')

Infine esporto in xml per controllare il risultato:

myricetta.toXml('spaghetti.xml')

Suggerimento

Notate l’annidamento sezione > fase > fase

Utilizzi reali delle structures in Genropy

Le structures sono utilizzate in Genropy:

  • per descrivere le pagine servite

  • per descrivere il model del database

  • per descrivere l’HTML delle stampe

Poi ogni tipo di entità descritta avrà il suo costruttore, che la struttura descritta produrrà: oggetti Python, tabelle SQL o elementi di DOM.


Allegati:

Autore della sezione: Saverio Porcari e Giovanni Porcari