Giovanni Bricconi

My site on WordPress.com

python e le stringhe

leave a comment »

Purtroppo mi tocca lavorare con molti vecchi programmi scritti in Python 2.x, non che python sia un cattivo linguaggio di per se ma ha un paio di cose che proprio non riesco a digerire:

  1. nei parametri dei metodi e delle funzioni non è possibile specificare il tipo della variabile. Io uso eclipse con pydev, se sto scrivendo un pezzo di codice in cui dichiaro le variabili ottengo i suggerimenti e questo è molto utile quando non si conoscono bene le api. Invece quando i parametri ti vengono passati non c’è modo di saperne il tipo e quindi addio suggerimenti, con conseguenti ricerche estenuanti o errori a run time
  2. le stringhe creano un sacco di bug, cioè non esiste un tipo stringa generico ma in python 2.x esistono il tipo string ed il tipo unicode. se si prova a stampare una stringa con caratteri accentati unicode su un file (come lo stdout…) si ottiene un eccezzione. Quindi se non ti ricordi di mettere almeno qualche carattere accentato qua e la nei tuoi test ti ritrovi a ottenere un programma che si pianta appena un utente italiano prova a usarlo.

Oggi come al solito ho dovuto perdere mezz’ora per testare bene che cosa succede con i caratteri accentati, per fortuna ho trovato questo utilie pezzo di codice

-def safe_unicode(obj, *args):
–    “”” return the unicode representation of obj
–        from http://code.activestate.com/recipes/466341-guaranteed-conversion-to-unicode-or-byte-string/ “””
–    try:
–        return unicode(obj, *args)
–    except UnicodeDecodeError:
–        # obj is byte string
–        ascii_text = str(obj).encode(‘string_escape’)
–        return unicode(ascii_text)

Ora converto tutte le stringhe che ho in ingresso in unicode e poi alla fine quando devo mandare le mail converto tutto in utf8.
Leggendo http://docs.python.org/py3k/whatsnew/3.0.html#text-vs-data-instead-of-unicode-vs-8-bit ho scoperto che il python 3 ha finalmente messo fine a questa situazione e tutte le stringhe sono diventate unicode. Motivo in più per fare il porting del vecchio codice, appena avrò finito di aggiornare solr alla nuova versione ci proverò.

Written by Giovanni

September 10, 2012 at 10:13 am

Posted in Varie

Leave a comment