[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