lunes, agosto 29, 2005
Una noticia de barrapunto y un post de mi interés:
- OpenWengo: voz sobre IP, basada en estándares abiertos y software libre.
- ¿Es legal que se pierda la garantía de un PC por abrir la caja?
Este finde hablando con JJ, me comentó sobre POJO. Un par de links relacionados:
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:
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:
Un par de noticias de barrapunto:
- Material sobre redes en español. Es interesante aparte de la noticia, porque es un ejemplo de uso del mismo software que la wikipedia.
- Entra el vigor el prefijo (51) para VoIP. Le tengo que echar un vistazo mas a fondo, ahora que me he convertido en usuario de skype....
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:
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.
jueves, agosto 18, 2005
miércoles, agosto 17, 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.
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.
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:
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.
Y para acabar un libro online sobre Python, Python Languaje Reference Manual.
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:
A ver si me animo esta tarde...
También tengo que echar un vistazo a la licencia Copyleft. Unos enlaces al respecto:
- La entrada en Español de la wikipedia.
- La entrada en Inglés (mas completa)
- Creative Commons (wikipedia) tiene una licencia copyleft.
jueves, agosto 11, 2005
Python y XML
Desde luego esta es la columna sobre Python y XML.
Los dos ultimos articulos que he estado ojeando:
- Sobre ElementTree
- Sobre PyXML
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:
- sobre tratamiento de html en python
- sobre un memory leak de htmllib (cuando le heché un vistazo recuerdo me pareció interesante)
- Choosing a XML Parser.
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
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:
- Una buena introduccion .
- Documentacion de docs.python.
- El PEP al respecto, el PEP 282.
- El API.
- Un articulo (tambien disponible en la documentación de python).
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.
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.
martes, agosto 02, 2005
Suscribirse a:
Comentarios (Atom)