.. _bag_book/bag/attributes: Attributi ========= Abbiamo già parlato in precedenza degli attributi, ma ora vedremo altri esempi e funzionalità legate agli attributi. Il metodo setAttr ----------------- Con il metodo ``setAttr`` si possono aggiungere, modificare o cancellare attributi. >>> b.setAttr('documents.letters.letter_to_sheila', createdOn='12-4-2003', createdBy='Walter', lastModify= '12-9-2003') >>> b.setAttr('documents.letters.letter_to_sheila', fileOwner='Steve') >>> print b 0 - (Bag) documents: 0 - (Bag) letters: 0 - (str) letter_to_mark: file0 1 - (str) letter_to_john: file1 2 - (str) letter_to_sheila: file2 Si può cancellare un attributo mettendo a ``None`` il suo valore >>> b.setAttr('documents.letters.letter_to_sheila', fileOwner=None) >>> print b 0 - (Bag) documents: 0 - (Bag) letters: 0 - (str) letter_to_sheila: file2 Leggere gli attributes ---------------------- Per leggere un singolo attributo si può usare il metodo ``getAttr`` al quale si passa come primo parametro il *path* del nodo e come secondo parametro il nome dell'attributo da leggere. >>> print b.getAttr('documents.letters.letter_to_sheila', 'fileOwner') Steve Oppure c'è modo di accedere direttamente ad un attributo anche con la sintassi delle parentesi quadre, usando il carattere speciele ``?`` seguito dal nome dell'attributo richiesto. >>> print b['documents.letters.letter_to_sheila?fileOwner'] Steve Path query su attributi ----------------------- Se il valore di un attributo è di tipo string è possibile specificare nel path una condizione sul valore di un attributo, come se il path stesso fosse una sorta di query. La sintassi è la seguente: ``#attributeName=value``. >>> bookcase = Bag() >>> mybook=Bag() >>> mybook.setItem('part1',Bag(),title='The fellowship of the ring',pages=213) >>> mybook.setItem('part2',Bag(),title='The two towers',pages=221) >>> mybook.setItem('part3',Bag(),title='The return of the king',pages=242) >>> bookcase.setItem('genres.fantasy.LOTR',mybook,title='the Lord Of The Rings',id='f123',author='Tolkien') Ora noi possiamo accedere a LOTR indicandolo come il libro il cui attributo autore è 'Tolkien'. >>> print bookcase.getItem('genres.fantasy.#author=Tolkien') 0 - (Bag) part1: 1 - (Bag) part2: 2 - (Bag) part3: Se il nome dell'attributo è ``id`` allora puoi omettere il nome dell'attributo e usare solamente *#=*. Ma ricorda che questa sintassi vale solo attributi che contengono stringhe. >>> print bookcase.getAttr('genres.fantasy.#=f123', 'title') the Lord Of The Rings .. sectionauthor:: Giovanni Porcari