pas d’arguments amb Python


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:

  • valors predeterminats: Si sabem que un valor serà gairebé sempre el mateix i en contades vegades un de diferent podem fer que sigui opcional donant-li un valor des de la declaració de la funció
  • 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

  • llista d’arguments: Si no sabem quants arguments (o no ens importa) podem dir que els agafi tots
  • 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 *

  • diccionari d’arguments: Si el que volem es enviar les dades però no ens recordem de l’ordre en que estan posats en la declaració (per exemple si fem taula_multiplicar(3,5,7) però volíem la taula del 7 del 3 al 5 ens trobarem amb la taula del 3 del 5 al 7) podem fer servir els noms dels arguments
  • 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 :)

mètodes virtuals? polimorfisme? delegació? herència?

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).

crear un repositori al subversion

En el servidor executeu:

repositori=NOM_PROJECTE

svnadmin create /var/svn/repos/$repositori
chown -R apache:svnusers /var/svn/repos/$repositori
chown -R g-w /var/svn/repos/$repositori
chown -R g+rw /var/svn/repos/$repositori/db
chown -R g+rw /var/svn/repos/$repositori/locks

En el client (per ssh) [1]:

svn import -m"comentari"  FITXERS_A_IMPORTAR svn+ssh://USUARI@MÀQUINA/var/svn/repos/$repositori

En el client (per http) [2]:

svn import -m"comentari" FITXERS_A_IMPORTAR http://MÀQUINA/svn/$repositori

[1] [2] Evidentment, s’ha de configurar tant l’ssh com l’apache perquè ho permetin :)

mostrar o amagar les traduccions

logotip del GNOMEdesprés de dinar no sabia què fer i m’ha picat el cuc hacker i m’he decidit a tancar el l’errada #106779 :)

moltes, moltes, moltes hores després he aconseguit que totes les peces encaixin i ara per fi ja he pogut enviar un pedaç que afegeix la funcionalitat d’amagar o mostrar les traduccions que ja estan al 100%

per fer-lo m’he basat en l’enllaç que hi havia en l’últim comentari de l’errada, però el problema era que no s’havia de commutar un o tots els elements de les llistes, sinó que uns i prou

de manera que m’he tirat dels cabells navegant per Internet fins que he trobat una manera fàcil i còmode:

  • primer de tot es defineix un identificador a cada una de les dues taules (la de documentació i la de interfície gràfica [1])
  • seguidament a partir d’aquests identificadors agafes els elements tr d’aquestes taules i els passes per un bucle
  • en el bucle l’únic que has de fer es comprovar si tenen un identificador que acabi amb -complete[2] i si es dóna el cas fer un (obj).style.display = ‘none’ o (obj).style.display = ”
  • evidentment, perquè això funcioni, fa falta posar-hi els identificadors quan es generen les pàgines

tot i que és molt millorable, si s’aplica aviat i es posa en els servidor en producció (el l10n.gnome.org) anirà que ni pintat ara que ja falta menys d’un mes per al llançament del GNOME 2.22 :D

[1] realment no caldria fer-ho així i es podria fer directament amb tot el document de cop, però com que les pàgines son prou grosses així la consulta al DOM es més curta

[2] i això és possible gràcies a que disposem d’expressions regulars a Javascript!

millores al damned-lies

logotip del GNOME Loveacabo de fer un parell de confirmacions (segons el Termcat) al damned-lies (el programa amb el que funcionen les estadístiques de traducció del GNOME), en la primera he canviat la visualització de les llistes de mòduls i persones (apart d’arreglar un cas molt concret en la llista de llengües) i en la segona aquestes llistes (i alguna altra) ara mostren el logotip del GNOME enlloc de un punt com es feia fins ara :)

són dues parides, però és de les poques coses que ser fer de moment, espero millorar amb el temps :D

SAX2007 dia del desenvolupador

ahir va ser un dia de bojos: al matí passar pel banc a buscar pounds, tot seguit a comprar quatre queviures per preparar menjar i finalment a la ferreteria a comprar adaptadors de la corrent per els endolls anglesos

tot seguit esperar en Jordi a l’entrada de Mont-rodon per anar cap a Sant Bartomeu del Grau, ahir tocava la jornada de desenvolupadors del SAX!

la jornada va transcorre durant el matí, en el qual primer en Ramon Roca va fer una mica d’introducció a, més que no pas com programar sobre el drupal i guifi.net, a com es treballa en equip en projectes de programari lliure

seguidament i just abans de dinar en Carles Bruguera va mostrar-nos la seva pàgina web basada en Plone que en principi era un encàrrec des de Manresa per gestionar la seva xarxa basada en Freifunk, però que al mateix temps (i no sense suar la gota) el va generalitzar prou perquè sigui extensible a qualsevol tipus de xarxa! :)

després de un bon dinar, es va fer la part més interessant de totes: seguir la guia que en el seu dia va escriure en Aleix Solé perquè tothom pogués tenir una còpia funcional de la web de guifi al seu portàtil o allà on volgués

com de costum, si una cosa no s’ha fet pràcticament mai sempre es troben errades o petits detalls que han anat canviant, per això mentre anava seguint la guia, també l’anava actualitzant :)

per desgràcia meva, amb el meu servidor de proves de Girona no me’n vaig sortir, diria que ha de ser més aviat un problema de configuració del apache i/o php més que no pas de fer algun pas erroni

a més en la part final, la més sensible, en la base de dades vam trobar tres errors en el sql, a veure quan em poden engegar el servidor de Girona hi ho comento a la llista tot enviant un pedaç per poder-se aplicar i així ja serà només seguir la guia :)

finalment ja a les 7 de la tarda o així vaig haver de marxar corrents cap a Sant Julià de Vilatorta a veure una senyora que no li anava Internet, total tampoc m’hi vaig estar ni 5 minuts i li vaig dir que anés a una botiga i ja tornant cagant llets cap a Mont-rodon per fer la maleta, uns quants entrepans per l’endemà i amb la Sílvia anar cap a Girona que avui ens havíem de llevar a quarts de 4 per anar a buscar el bus que ens portaria a l’aeroport de Girona:

Birmingham que venim!!!

múltiples constructors en php

doncs es veu que no es pot, així de ras i curt

la idea dels constructors múltiples és que quan construeixes un objecte, el puguis construir a partir de diferents (o cap valors), per exemple es podria construir l’objecte triangle a partir de la longitud de dos costats i un angle, o a partir de les tres longituds, etc etc

pel que ser, com a mínim el c++ ho permet i pel cas concret que estic fent a la feina m’aniria de perles poder-ho utilitzar

al final ho he solucionat passant un array amb les dades que necessito a l’únic constructor que et permet el php i dins d’aquest cridar una o altre funció segons les dades que conté l’array :)

de compres

doncs sí, tot i que la compra no arribarà fins a finals de mes o principis del que bé :(

és un llibre per estrany que sembli i espero que em serveixi, i molt!

sembla que m’està agafant la dèria de llegir últimament, ara abans d’anar a dormir sempre llegeixo un parell d’articles del sàpiens, que apart d’arribar-ne un cada mes, tinc tots els que vaig demanar i me’ls haig de llegir tots!

programar

és una cosa no que feia des de fa molt!

tan, que fa temps que li tinc por gairebé, suposo que com tot es per falta de practicar, però tot i que quan penso en algun problema informàtic, penso com es podria resoldre, les tècniques que es podria utilitzar (shell script, web, programa amb interfície gràfica, el tipus llenguatge), pensar en el codi que s’hauria de fer em perd

és més el fet de si punts i comes, les funcions a utilitzar, etc etc que no pas el programa en si, tot i que si es coses grosses tampoc se molt bé com agafar-ho la veritat

per això avui que he fet pràctiques de ESA[1] he aprofitat la tarda i ara al vespre per fer alguns exemples MOLT cutres amb c, però almenys ja se fer un hello world, una calculadora, la sèrie de fibonnaci, girar una cadena i ara estic en procés de fer un factorial (o sigui alguna cosa recursiva) :)

[1] a ESA fem servir un programa de control de processos que d’una manera molt fàcil et deixa crear interfícies gràfiques i després generar les callback functions per a controlar els elements de la interfície, que al final és només agafar dades de la interfície i aplicar-les amb alguna transformació trivial a algun altre element de la interfície, però alguna cosa sempre és millor que res :)

SQL

no intenteu arreglar una inscripció esborrant camps a mà ^^u

mirant-ho pel costat positiu, li he tret MOLT suc al Ctrl+H del gedit, que a més amb el ressaltat de coincidències que te, va de perles si vols arreglar algun desastre que has fet :D

veig que almenys el que és l’SQL encara el tinc una mica fresc, perquè tot i consultar en alguna o altre pàgina web la sintaxi més o menys ja la clavava :)