[Python] Comparare stringhe unicode

Daniele Varrazzo piro a develer.com
Gio 13 Giu 2013 22:21:11 CEST


On 2013-06-13 17:14, Gianni Di Noia wrote:
> Scusate, ho questa funzione che uso per popolare il DB di articoli 
> presi da
> feed di vario tipo (atom, rss..) con l'aiuto di feedparser:
>
> def check_feed(feedk, e=0):
>     feed = feedk.get()
>     parsed = fetch_feed(feed.feed)
>     if parsed:
>         try:
>             entry = parsed['items'][e]
>             while unicode(feed.last_id) != unicode(entry['link']):
>                 scrivineldb()
>                 e += 1
>                 entry = parsed['items'][e]
>             feed.last_id = unicode(parsed['items'][0]['link'])
>             feed.put()
>         except:
>             pass
>
> Oltre al try/except/pass che non mi piace ho un problema nel 'while' 
> che ha
> il compito di scrivineldb() finché non raggiunge l'ultimo articolo 
> del
> processo precendente (feed.last_id).
>
> Il problema è che anche quando "feed.last_id" e "entry['link']" sono 
> uguali
> la funziona li identifica come diversi. Ho pensato che dipenda dalla
> codifica - che non conosco abbastanza - ma non riesco a risolvere:
> feed.last_id è una StringProperty di appengine che la documentazione 
> dice
> essere unicode. Lo uso come un cursore, salvando l'ultimo "item" in 
> modo
> che nel prossimo task la funzione si fermi quando lo raggiunge 
> evitando
> duplicati.
> entry['link'] è anche una stringa unicode come dice la documentazione 
> di
> feedparser ed è l'oggeto che comparo col 'cursore'.
> Entrambe sono degli url in unicode tipo: 
> u'http://esempio.it/post/123'
>
> La comparazione nel while dovrebbe funzionare anche senza esplicitare 
> l'
> unicode() ma niente continua a consumare risorse processando tutti 
> gli
> articoli nel feed.
>
> idee..

Non c'è niente di magico nel confrontare stringhe unicode (disse lui 
mentendo, omettendo dettagli osceni quali surrogate pairs, 
composition...)

Prova a stampare map(ord, u), dove u è la tua stringa unicode, per 
vedere se il contenuto è effettivamente diverso a livello di codepoint, 
ma lo escludo.

     In [1]: print map(ord, u'ciao')
     [99, 105, 97, 111]

Propendo per 1) hai un errore di logica per cui il ciclo non fa quello 
che ti aspetti (in questo caso farciscilo di print oppure eseguilo 
passo-passo con pdb) oppure 2) hai degli spazi bianchi di troppo, che la 
map(ord) di sopra dovrebbe evidenziarti:

     In [2]: print map(ord, u'ciao ')
     [99, 105, 97, 111, 32]


-- 
Daniele Varrazzo - Develer S.r.l.
http://www.develer.com


Maggiori informazioni sulla lista Python