21.04.2013 Views

Inmersión en Python Inmersión en Python - iPereda

Inmersión en Python Inmersión en Python - iPereda

Inmersión en Python Inmersión en Python - iPereda

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

será difer<strong>en</strong>te como verá <strong>en</strong> unos mom<strong>en</strong>tos.<br />

Ahora nuestra función plural toma un segundo parámetro opcional,<br />

language, que por omisión es <strong>en</strong>.<br />

Usamos el parámetro language para construir el nombre de un fichero,<br />

abrirlo y leer su cont<strong>en</strong>ido d<strong>en</strong>tro de una lista. Si language es <strong>en</strong>, <strong>en</strong>tonces<br />

abriremos el fichero rules.<strong>en</strong>, lo leeremos <strong>en</strong>tero, lo cortaremos <strong>en</strong> los<br />

retornos de carro y devolveremos una lista. Cada línea del fichero será un<br />

elem<strong>en</strong>to de la lista.<br />

Como pudo ver, cada línea del fichero ti<strong>en</strong>e <strong>en</strong> realidad tres valores, pero<br />

están separados por espacios <strong>en</strong> blanco (tabuladores o espacios, no hay<br />

difer<strong>en</strong>cia). Relacionar la función string.split sobre esta lista creará una<br />

lista nueva <strong>en</strong> la que cada elem<strong>en</strong>to es una tupla de tres cad<strong>en</strong>as. De manera<br />

que una línea como [sxz]$ $ es quedará dividida <strong>en</strong> la tupla ('[sxz]$',<br />

'$', 'es'). Esto significa que patterns cont<strong>en</strong>drá una lista de tuplas, igual<br />

que habíamos programado <strong>en</strong> la fase 4.<br />

Si patterns es una lista de tuplas, <strong>en</strong>tonces rules será una lista de las<br />

funciones creadas de forma dinámica con cada llamada a buildRule. Llamar<br />

a buildRule(('[sxz]$', '$', 'es')) devuelve una función que toma un<br />

único parámetros, word. Cuando se invoque esta función devuelta, ejecutará<br />

re.search('[sxz]$', word) and re.sub('$', 'es', word).<br />

Al estar creando ahora una función de combinación y transformación<br />

combinada, necesitamos invocarla de forma difer<strong>en</strong>te. Simplem<strong>en</strong>te<br />

llamamos a la función y si devuelve algo, eso es el plural; si no devuelve<br />

nada (None), <strong>en</strong>tonces la regla no coincidió con nada y necesitamos probar<br />

con otra más.<br />

La mejora aquí es que hemos apartado completam<strong>en</strong>te las reglas de<br />

pluralización a un fichero externo. No sólo se puede mant<strong>en</strong>er el fichero de<br />

forma separada sdel código, sino que hemos creado un esquema de nombres<br />

donde la misma función plural puede usar difer<strong>en</strong>tes listas de reglas,<br />

basándose <strong>en</strong> el parámetro language.

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!