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  <createdOn='10-7-2003' createdBy='Jack'>
        1 - (str) letter_to_john: file1  <lastModify='11-9-2003' createdOn='11-5-2003' createdBy='Mark'>
        2 - (str) letter_to_sheila: file2  <lastModify='12-9-2003' createdOn='12-4-2003' fileOwner='Steve' createdBy='Walter'>

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  <lastModify='12-9-2003' createdOn='12-4-2003' createdBy='Walter'>

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: <pages='213' title='The fellowship of the ring'>
1 - (Bag) part2: <pages='221' title='The two towers'>
2 - (Bag) part3: <pages='242' title='The return of the king'>

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