lunes, agosto 29, 2005

Un link interesante sobre matemáticas, MathWorld.
Una noticia de barrapunto y un post de mi interés:

Este finde hablando con JJ, me comentó sobre POJO. Un par de links relacionados:

miércoles, agosto 24, 2005

Hoy hay un par de noticias sobre google e IM:
Habrá que probarlo.

martes, agosto 23, 2005

Inclusión mutua de módulos en python



Pensando en un desarrollo que voy a iniciar, me dí cuenta que podía tener una inclusión mutua de módulos, y como no tenía claro como se comporta python, decidí probarlo con:


# A.py
from B import B

class R:
def __str__(self):
return "hello world"

if (__name__ == "__main__"):
b = B()
b.r = R()
print "b: ",b



from A import R
class B:

def __init__(self):
self.r = R()

def __str__(self):
s = str(self.r)
return s


Dándome el error que comento en este post [comp.lang.python].
El post lo puse cuando no había encontrado nada sobre el problema, luego buscando mas correctamente me encontré un post en los grupos. De hecho hay varios, buscando por 'mutual'
Y una entrada en la faq de python.
En una respuesta del post me pasaron este link.

Y volviendo al problema...

Al ser python un lenguaje interpretado, es muy posible que realmente no sea necesario hacer el import (como va a ser mi caso). El tipo del objeto definido en 'A' y que usará 'B', se determinará en tiempo de ejecución. Una mente acostumbrada a lenguajes compilados, como la mía, no cayó en esto.

De todas formas, siempre estaría la solución de refactorizar el código (la que mas me gusta personalmente), o bien hacer el import dentro de un método o función (lo he probado y funciona).

Para acabar, muestro el código final, sin necesidad del import:


# A.py
from B import B

class R:
def __str__(self):
return "hello world"

if (__name__ == "__main__"):
b = B()
b.r = R()
print "b: ",b




# B.py
class B:

def __init__(self):
self.r = None

def __str__(self):
s = str(self.r)
return s

lunes, agosto 22, 2005

Me pasa Hector un link sobre como acelerar eMule.

Un par de noticias de barrapunto:

viernes, agosto 19, 2005

Sobre pythfilter.py

Hace ya tiempo comenté ([1],[2])sobre este filtro python para convertir código python a esqueletos en C++. La utilidad del mismo es para luego poder usar doxygen.

Lo estoy echando un vistazo con mas detalle, y seguramente le meta mano, para poder incluir en la documentación los atributos de las clases.

De momento quería añadir unos detalles:

  • La opción -f se usa para filtrar simplemente un fichero. El uso normal será usarlo con dos argumentos, el directorio origen y el destino. Usándolo de este modo, el mismo se invoca recursivamente con la opción -f, con lo cual es necesario que python este en el path.
  • Si posteriormente queremos usar doxygen, los diagramas de colaboración estarán incompletos, por no tener los miembros generados
  • Con los diagramas de herencia cuando heredemos de clases que no estén en nuestro paquete, tampoco saldrán, a no ser que hagamos que doxygen sea capaz de localizar sus esqueletos de C++. Con clases internas de python, como no se necesita hacer imports, habrá que hacer algún tipo de procesamiento, para incluir en los ficheros que nos interesen una referencia a algún fichero en el cual tengamos las declaraciones que nos interesen.
Pythfilter usa el modulo tokenizer. En esta página hay un par de ejemplos majos.
Contenidos Web 2.0 en Español [barrapunto.com]

jueves, agosto 18, 2005

martes, agosto 16, 2005

Python, xml y unicode


Sobre este tema hace unos dias puse un par de links. Ya he tenido tiempo de leerlos y son recomendables.

De el Python Unicode Tutorial esta interesante el ejemplo de recoder de latin-1 a utf-8:



import codecs
#Encoding / decoding functions

def encode(latin1_data):
return unicode(latin1_data,'latin-1').encode('utf-8'),len(latin1_data)

def decode(utf8_data):
return unicode(utf8_data,'utf-8').encode('latin-1'),len(utf8_data)

#StreamCodecs

class Codec(codecs.Codec):
def encode(self,latin1_data):
return encode(latin1_data)
def decode(self,utf8_data):
return decode(utf8_data)

class StreamWriter(Codec,codecs.StreamWriter):
pass

class StreamReader(Codec,codecs.StreamReader):
pass

#Codec registry entry point

def getregntry():
return(encode,decode,StreamReader,StreamWriter)



Y aquí podemos ver un ejemplo de uso.

Con respecto al default encoding de unicode, parece que en sys puede existir, o en algún momento ha existido la función setdefaultencoding. Pero al menos en mi distribución no viene.
De todas formas si queremos probar a cambiar el encoding por defecto, lo que podemos hacer es cambiar el valor de la variable encoding de site.py.
Un par de noticias de barrapunto:

viernes, agosto 12, 2005

Generating DOM Magic


Tenia pendiente echar un vistazo a este artículo de Uche Ogbuji.

El artículo en si está interesante, ya que muestra varias rutinas que trabajan sobre un árbol XML.
Las rutinas se centran en el uso de generators, y los comparan con el uso de recursión y xpath.
La técnica mas lenta es usando xpath. Es bueno saberlo.
Entre generators y el uso de recursión están ahí ahí, pero claro, con la prueba realizada. Con otros ejemplos posiblemente se incremente la diferencia a favor de los generators.

¡Ah! los generators por lo visto también son mas eficientes que los iterators.

Pero lo mas interesante del articulo, es que muestra enlaces a una serie de temas en python de los cuales no tenía constancia, y que pueden ser englobados dentro de Stackless Python. Dentro de stackless python tenemos por ejemplo: continuations, generators y microthreads (o coroutines).

Para finalizar unos links a unos artículos:
Ya comenté sobre Python Pitfalls en otro post. Dos articulos relacionados son:

Y para acabar un libro online sobre Python, Python Languaje Reference Manual.

Static Local Variables in Python


Pues eso variables estaticas locales en Python, con un ejemplo:

>>> def foo(v=[1]):
... print v[0],
... v[0] += 1
...
>>> foo()
1
>>> foo()
2
>>> foo()
3


Tengo que echar un vistazo a FreeMind, una aplicación para representar mapas mentales.
A ver si me animo esta tarde...
También tengo que echar un vistazo a la licencia Copyleft. Unos enlaces al respecto:

jueves, agosto 11, 2005

Guide to Python introspection.

Python y XML


Desde luego esta es la columna sobre Python y XML.
Los dos ultimos articulos que he estado ojeando:
El autor de la columna es Uche Ogbuji. Es el fundador de Fouthought empresa que desarrolla 4suite.
Dentro de 4Suite esta Domlettes, una implementacion DOM muy ligera. Dentro de Domlletes tenemos FtMinidom:

FtMiniDom - available only in 4Suite 0.12.0a1 through 1.0a4, FtMiniDom is identical to cDomlette, but is implemented completely in Python. In most cases, it uses your platform's PyExpat to do the XML parsing. FtMiniDom is very much like the xml.dom.minidom that comes with Python and the xml.dom.minidom replacement that comes with PyXML, but it does have some differences and added features. You can force the use of FtMiniDom by setting USE_MINIDOM=1 in your environment before importing Ft.Xml.Domlette.


Para acabar un par de enlaces mas:



miércoles, agosto 10, 2005

De HTML a XML con python


Ya hace tiempo, estuve mirando algun enlace al respecto, ya que intuía que me iba a tocar trastear con estos temas.
De nuevo me he encontrado con el siguiente articulo 'Wrestling HTML'. Es bueno, te cuenta lo que tienes que hacer para pasar de html a xml usando varias posibles herramientas. Menciona en el articulo tanto uTidyLib, como libxml2 HTMLParser.

El mismo autor tiene otro articulo sobre eluso de libxml.

Y para acabar este post unos links mas:

Pyrex


¡¡¡Redios!!! La de cosas que hay por ahí, relacionadas con Python. Me acabo de encontrar con Pyrex, según comentan en la introducción, se trata de un lenguaje para extender python, de manera que podamos mezclar codigo python con tipos de C.

Se ve que lxml lo usa.

DOM Parser


Voy a ver si hoy pruebo un parser DOM. El candidato va a ser libxml2, el cual es un parser para C, pero que tiene bindings para python.
Por lo que he podido leer, no es muy recomendable su uso, de ahí que vaya a usar lxml.

Ya para acabar, lxml usa como API el modulo ElementTree. Parece muy util, para ser usado, incluso sin usar un parser DOM.

lunes, agosto 08, 2005

Tidy



Tidy es una herramienta muy util para evitar errores de parseo usando parsers html, ya que 'corrige' el html.
Para usarlo dese python, he encontrado dos librerias:

El segundo (el unico que he probado) requiere:

  • tener instalado tidylib.
  • y tener instalado ctypes.

viernes, agosto 05, 2005

Parsers html en python


Este tema me dará para hablar para largo, pero para empezar solo comentar que hay dos parsers estandard, es decir que vienen con la distribución:

En el proyecto en el que estoy actualmente han usado el primero, pero tampoco fueron conscientes en su momento de la existencia del segundo.

Python standard logging


Por lo visto el sistema de logs que viene con python esta basado en el de log4j.
Varios enlaces al respecto:

Nota: El termino PEP viene de Python Enhacement Proposal. Y hay unos cuantos.
He encontrado un link muy interesante, sobre python pitfalls.
De todas formas, buscando en google por 'python pitfalls', salen unos cuantos links.

valgrind



Hoy me ha comentado Carlos sobre valgrind. La idea sería usarlo para detertar memory leaks. La lista de proyectos que lo usan es espectacular. Debe de estar realmente bien.

jueves, agosto 04, 2005

WikiBooks


Al hacer una busqueda me salio este wikibook sobre computer programming. A partir de ese enlace saqué las paginas principales en inglés y español de los wikibooks.

Fedora



Me comenta JJ que Fedora Core 4 esta que te cagas.

Daemon Tools



No conocia estas herramientas. Muy interesesantes. Te permiten teniendo una imagen ISO de un CD en el disco duro, montarlo como unidad.
Un par de noticias de barrapunto:

martes, agosto 02, 2005

Un buen punto de partida para documentacion sobre Python y XML.