Posting tweet...
Degut a la feina haig de fer servir un programa1 que necessita la versió 2.4 de Python i diverses biblioteques (la PIL per exemple).
El problema està en que per defecte Gentoo compila els paquets de Python per a la versió de Python activa del sistema. Com que el sistema de paquets de Gentoo depèn de la versió 2.5 de python tenim un problema: no puc compilar per a la versió 2.4 ja que el programa que s’utilitza per a gestionar els paquets no es pot executar amb aquesta versió!
Si compilo els paquets per a la versió 2.4 de Python llavors no em funcionen per a la versió 2.6, o el que és pitjor (i que em va passar ahir mateix) que si per descuit actualitzes algun paquet de python te’l compila per a 2.6 i t’esborra la versió de 2.4.
Per sort hi ha una solució molt fàcil: al fitxer de configuració de l’emerge (el famós /etc/make.conf) hi pots establir una variable nova:
USE_PYTHON=”2.4 2.6″
Amb aquesta única línia ja li estàs dient a l’emerge que cada vegada que instal·li un programa de python el compili tant per a la versió 2.4 i la 2.6
Com que a la feina nova (més sobre això d’aquí uns dies) entre moltes altres coses també fem/farem pàgines web amb Plone ens ha semblat que seria una bona idea anar a la conferència anual que es fa cada any, així que tal com diu la imatge del costat des del 27 d’octubre fins a l’1 de novembre estaré a Budapest.
Com que la Sílvia treballa des de casa i tant li fa si es la casa de Molins o un apartament de Budapest també s’hi ha apuntat
Així que si per casualitat esteu a Budapest durant aquells dies feu-ho saber i ens podem veure
Els que ja hi heu estat podeu deixar comentaris amb els must-see de Budapest també
Espero aprendre’n molt perquè de moment tinc un cacau força important amb el Plone aquest
Tot i que el Vim ja incorpora de forma predeterminada el ressaltat de sintaxi de Python avui he descobert que hi ha una extensió que permet millorar-ne encara més el ressaltat.
Només cal baixar el fitxer per a la versió de Python que utilitzeu (jo he baixat la versió 2.6 i la 3.0 ja que es poden instal·lar en paral·lel) i copiar-los a ~/.vim/syntax.
Obriu un fitxer de Python amb el vim i ja veureu
A més si us mireu els fitxers que us acabeu de baixar hi trobareu unes quantes opcions més de personalització (que ressalti el format del print, que mostri els espais i tabulacions que sobren …, totes aquestes personalitzacions les podeu afegir al ~/.vimrc.
Ja feia temps que s’estava coent el canvi i avui finalment s’ha fet (nota oficial)
Si ja us agradava les estadístiques del Damned-lies ara encara us agradarà més (si sou traductor) ja que s’ha integrat tota les funcions de gestió de traduccions del Vertimus a aquest primer.
Què vol dir tot plegat? Doncs que a partir d’ara ja podrem assignar-nos mòduls, marcar-los com a que esteu treballant amb ell (exemple al Totem i els detalls), que ja està traduït, que el revisor ja l’ha revisat i per tant està llest per pujar o simplement posar-hi un comentari (hi ha alguna errada o que l’estil no és correcta).
Tot això ha estat possible gràcies a que tant un com l’altre estaven escrits en Python (el Vertimus es va reescriure de PHP a Python de fet) i que seguidament es van integrar amb l’entorn de treball Django.
Tot aquest treball l’han fet entre en Claude (col·laborador en la traducció del GNOME al Francès i membre del GTP) i l’Stéphane Raimbault (desenvolupador principal del Vertimus), evidentment si sabeu Python i Django esteu més que convidats a col·laborar-hi.
El següent gran pas del desenvolupament del Damned-lies serà integrar-hi el Transifex, un sistema perquè des de la pròpia pàgina web del Damned-lies es puguin fer les confirmacions (commits en anglès) de les traduccions i per tant tot el procés de traducció (que no la traducció en sí) ja estiguin integrats en una sola eina (estadístiques + gestió de la traducció + pujar els fitxers).
Però les bones notícies pels traductors no acaben aquí! En Leonardo Fontenelle ha fet un petit repás a com està el Gtranslator 2.0 i la veritat és que promet MOLT!
Traductors del GNOME … stay tuned!
Quan portes setmanes darrere un error que no hi ha manera racional d’explicar-lo i després d’un intensiu des de les 7 de la tarda a pràcticament les 12 de la nit (uff són unes 5 hores!) però l’acabes resolent … uff no té preu!
Això sí, ha sigut difícil trobar-lo el c*** quan per fi l’he trobat tenir obertes 12 terminals, diferents instàncies del Meld, uns quants Gedit, a saber quantíssimes pàgines web (amb l’Epiphany òbviament , etc etc
Com podeu veure que he posat el logo de l’empresa on treballo és un programa que estic fent per l’empresa i que gràcies a que ja (per fi!!) he trobat aquest bug aviat (espero) podrà veure la llum el què he estat fent
Nota no relacionada en absolut: Intenteu no barrejar programar en C i amb Python, us oblidareu TOTS els punt i coma del final de sentències a C i haureu de recompilar com 12 vegades per tonteries per l’estil
Per tenir les dades que genera una aplicació que estic fent amb Python he escrit un parell de funcions que em permeten tenir un document estructurat (en xml) de totes les dades que es generen[1].
La tècnica de introspecció es basa en aprofitar les meta-dades (per dir-ho d’alguna manera) que tens sobre els objectes que has anat construint en l’aplicació per (dinàmicament) poder-ho formatar d’alguna manera.
Amb Python tenim algunes propietats, com molt bé es descriuen en un article d’IBM [2]:
for element in objecte__dict__: print “%s val %s” % (element, objecte.__dict__[element])
Només amb això podem treure molt suc a la informació que tenim ara mateix a les estructures de dades que estem muntant i si es fa el més genèric possible, no caldrà tocar ni una coma quan afegim més dades o hi encadenem alguna altra estructura.
[1] En certa manera hi ha truc perquè el sistema són classes que tenen diccionaris de classes a dintre fins a 5 nivells de manera que la introspecció és recursiva per naturalesa.
[2] És una mica vell, del 2002, però pels meus objectius n’he tingut ben prou
Per pas d’arguments s’entén que quan crides una funció li dius amb quins valors vols que faci la seva funció.
Per exemple:
suma(3,4) # retorna 7 suma(4,5) # retorna 9
El problema pot passar (com m’acabo de trobar i solucionar) en que si haig de passar força arguments (6 en concret) i a més els haig de redirigir es fa pesat mantenir les llistes d’arguments sincronitzades, per exemple si tenim un parell de classes que una hereda (Secundaria) de l’altre (Principal) i volem cridar el constructor de Principal des del constructor de Secundaria haurem de fer una cosa per l’estil:
class Principal(): def __init__(self, primer, segon, tercer, quart, cinquè, sisé): /* … operem amb ells …*/ class Secundaria (Principal): def __init__(self, primer, segon, tercer, quart, cinquè, sisé): Principal.__init__(primer, segon, tercert, quart, cinquè, sisé)
Per a simplificar-ho Python ens permet diverses coses:
def taula_multiplicar(base, inici=0, final=10): # declarem una funció amb 3 paràmetres dos dels quals ja tenen un valor assignat taula_multiplicar(3) # ens mostraria la taula de multiplicar del 3 des de 3*0 fins a 3*10, la típica de l’escola taula_multiplicar(4, 5) # ens mostraria la taula del 4 des del 5 fins al 10 taula_multiplicar(4, 9, 12) # ens mostraria la taula del 4 des del 9 fins al 12
def crea_directoris(*directoris): # declarem una funció que agafa tots els arguments que li passen i els posa en una llista (tupla en Python) crea_directoris(‘/home/gil’, ‘/home/silvia’, ‘/home/softcatala’, ‘/home/gnome’ # ens crearia els 4 directoris que li passem llista = ( ‘/home/gil’, ‘/home/silvia’ # creem una llista amb els arguments crea_directoris(*llista) # passem la llista enlloc de tot el text en la crida, li indiquem que es una llista amb el símbol *
taula_multiplicar(inici=3, final=5, base=7) # ara ja tindrem la taula de multiplicar del 7 des del 3 al 5def parelles(**valors): # declarem una funció en que rebrem parelles de valors parelles(un=1, dos=2, tres=3) # passem parelles de paràmetres amb nom amb el seus valors diccionari = { ‘un’: 1 , ‘dos’: 2, ‘tres’: 3} # creem un diccionari parelles(**diccionari) # enlloc d’haver-ho de posar tot en la crida a la funció creem un diccionari abans i ho indiquem en la crida amb els dos * (igual com en el pas per llista)
També es poden fer coses més sofisticades i complicades com barrejar llistes, diccionaris, valors predeterminats i paràmetres normals, per exemple:
def funcio_estranya( valor_posicional, valor_predeterminat=5, *resta_arguments): # amb aixo creem una funció que el primer paràmetre es un de normal, després en bé un d’opcional i la resta hauran de ser una llista d’arguments variable
No està malament eh
Aquest tros de codi amb Python:
#!/usr/bin/env python # -*- encoding: utf-8 -*- class main(): def laptop(self): self.p() class one(main): def p(self): print "Lenovo" class two(main): def p(self): print "Asus" # Creem un parell d'instàncies i_one = one() i_two = two() i_one.laptop() # mostra "Lenovo" i_two.laptop() # mostra "Asus"
El que fa bàsicament és crear 3 classes (dues d’elles -one i two- hereden de la primera -main-) de manera que totes les instàncies que es facin de les classes filles tindran els mètodes de la classe mare (el mètode laptop en aquest cas).
A més cada classe filla defineix una mateixa funció (la funció p).
La gràcia d’aquest disseny és que et permet definir una especialització de comportament de manera que per exemple, si tens una col·lecció d’instàncies de one i two barrejades però vols saber-ne quin portàtil tenen, només cal que executis el mètode laptop a tota la col·lecció que sense cap problema ens dirà per a cada un d’ells quin portàtil té.
El dubte que em queda ara és: quin nom rep aquesta tècnica? Perquè he estat buscant en el llibre de Python que tinc (Learning Python d’O’Reilly) d’on he recordat aquesta possibilitat del Python i no he aconseguit trobar-la ni a l’índex del principi (per temes) ni el del final (per nom).
A la feina havia d’ordenar un diccionari pels valors (i no per les claus), però després volia accedir (per clau) a les dades sense haver d’estar iterant per tot el diccionari fins que trobés una clau que tenia per valor el valor pel que estava iterant (mola l’explicació eh
Doncs molt fàcil, crees un altre diccionari amb els elements al revés i així ja tens l’accés directe tant a la clau com al valor
O sigui:
dict((v,k) for k,v in dictionary.items())
Fàcil oi?
Trobat a la llista de Python (del 2005!)
Recordatori per a mi mateix i per a qui pensi que li és útil
dir(tipus variable o objecte ja declarat)
Amb això ens mostra totes les funcions que podem utilitzar sobre un tipus de dada, per exemple:
dir(str)
['__add__', '__class__', '__contains__', '__delattr__', '__doc__', '__eq__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', __getslice__', '__gt__', '__hash__', '__init__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__str__', 'capitalize', 'center', 'count', 'decode', 'encode', 'endswith', 'expandtabs', 'find', 'index', 'isalnum', 'isalpha', 'isdigit', 'islower', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']
I per saber què fa, per exemple, zfill, només cal que teclajem:
help(str.zfill)
zfill(...) S.zfill(width) -> string Pad a numeric string S with zeros on the left, to fill a field of the specified width. The string S is never truncated.