a conclusione del dibattito, volevo riassumere ciò che ho fatto, perchè
penso che potrebbe tornare utile a qualcuno, in futuro.
mi pare che entrambe le soluzioni non siano facili per un utente di
bassa lega che voglia modificare i criteri di ricerca.
il secondo li ordina (per esempio potrei passare il criterio "Title",
oppure data di pubblicazione)
in qualsiasi page template, posso quindi definire due liste (popolate
con i risultati di due cercatori)
che successivamente fondo e riordino sulla base di un campo passato
come parametro (purché comune a tutti gli elementi delle due liste)
ecco
un esempio (ricordo il problema iniziale: avere una lista che
contenesse l'unione dei risultati di due o piu' cercatori)
siano list1 e list2 due cercatori (uno per i cani e l'altro per i gatti)
ho messo il seguente codice in un page template che mi serve per
visualizzare
<tal:foldercontents define="
folderContents1
python:container.list1.queryCatalog();
folderContents2
python:container.list2.queryCatalog();
folderContents
python:context.list_join(folderContents1, folderContents2);
folderContents
python:context.sort_by_attr(folderContents,'Title');
DOMANDA:
mi rimane da capire un misterioso comportamento (di python e dei
cercatori)
che mi causava un errore (non sempre, dipendeva da come avevo definito
i due cercatori)
date due liste folderContents1 e folderContents2 che contengono i
risultati di due cercatori (simili come criteri, ma non uguali)
python:folderContents1 + folderContents1 NON dà errore
python:folderContents2 + folderContents2 NON dà errore
python:folderContents1 + folderContents2 DA' ERRORE a runtime e
dice che non posso unire stringhe a liste (eppure sono due liste non
vuote)
python:folderContents2 + folderContents1 DA' ERRORE a runtime
diverso da quello della riga precedente (ovvero cambiando l'ordine
degli addendi, cambia l'errore)
in sostanza non posso unire due liste usando l'operatore di somma
mi è toccato usare (nel codice python dell'ExternalMethod) l'operatore
"+=" che è piu' "tollerante".
def list_join(list1, list2):
intermed = []
intermed += list1
intermed += list2
return intermed
e in questo modo non vengono segnalati errori e tutto sembra funzionare
Giacomo
-----------------------------------------------------
#questa è la funzione che ordina sulla base di un attributo (il cui
nome viene passato come parametro)
def sort_by_attr(seq, attr, reverse=False):
intermed = [ (getattr(seq[i], attr), i, seq[i]) for i in
xrange(len(seq)) ]
intermed.sort(reverse=reverse)
return [ tup[-1] for tup in intermed ]
#funzione che attacca assieme due liste
def list_join(list1, list2):
intermed = []
intermed += list1
intermed += list2
return intermed