Ahora a simple vista, no sabria decirte si hay alguna manera simple, supongo que investigando algo, podria sacar las cosas en claro. Lo que si, te puedo decir, es que viendo el codigo fuente muchas veces ayuda a entender como implementar un monky patch de manera adecuada y/o si es posible hacerlo.
Hay que tener en cuanta que hay casos, como por ejemplo tipos nativos de python, para modificarlos es... complicado, de hecho no hay una manera simple y que funcione en todos los lados. Sin embargo hacer monky patch a modulos python es mas facil. Por eso dije que depende de la implementacion, puede que se pueda hacer algo, puede que no... Igual deberias pensar en hacer monky patch no a la lista si no a la clase que genera esa lista, modificando el comportamiento de la clase, controlarias lo que se genera. Pero todo esto, conceptualmente queda colgando y dependiendo de si puedes hacer monky patch a la clase o no. No te puedo dar una respuesta fija y fiable, ya que cada caso es distinto, y tendria que saber como esta implementada la biblioteca :D Andrei. El día 19 de septiembre de 2011 13:45, Oswaldo <[email protected]> escribió: > >> >> quizas si nos muestras el codigo de libr podemos ayudar mejor. > > Jose, Nekmo, Andrey, intento explicarme mejor: > > La libreria en cuestion es un archivo .pyd escrito en C, aunque el codigo > fuente esta disponible preferiría no tocarlo. > > Esta libreria tiene una propidad 'notices' que es un objeto 'list' > >>>> type(libr.notices) > <type 'list'> > > El funcionamiento de esta propiedad es el siguiente: > > Al ejecutar un método de la libreria esta genera una serie de mensajes que > almacena en la lista 'libr.notices'. Una vez finalizado la ejecución del > método puedo consultar la lista para ver los mensajes generados. > > Como la ejecución de este métido puede ser pesada me interesa interceptar > esos mensajes en el momento en el que la libreria los agrega a la lista > 'notices' sin necesidad de esperar a que finalice la ejecución. > > El problema es que al intentar sustituir el objeto lista original de la > libreria con el mio modificado siempre me encuentro con el error 'readonly > attribute' > >>>> libr.notices = mylist > Traceback (most recent call last): > File "<input>", line 1, in <module> > TypeError: readonly attribute > >>>> setattr(libr, "notices", mylist) > Traceback (most recent call last): > File "<input>", line 1, in <module> > TypeError: readonly attribute > > Como segunda opción, ya que no puedo sustituir la lista por mi lista > personalizada, era modificar el método append en la propia lista original, > pero el tipo lista tampoco deja reemplazar el metodo append. Se puede > comprobar con una lista normal: > >>>> def myAppend(self, value): > ... print "myappend", value > ... list.append(self, value) > >>>> l = [] >>>> l.append = myAppend > Traceback (most recent call last): > File "<input>", line 1, in <module> > AttributeError: 'list' object attribute 'append' is read-only > > La pregunta es: ¿hay alguna forma de saltarse esa restricción 'read-only'? > > Saludos, > > -- > Oswaldo > _______________________________________________ > Python-es mailing list > [email protected] > http://mail.python.org/mailman/listinfo/python-es > FAQ: http://python-es-faq.wikidot.com/ > -- http://twitter.com/andsux http://www.niwi.be **** http://www.freebsd.org/ http://www.postgresql.org/ http://www.python.org/ http://www.djangoproject.com/ "Linux is for people who hate Windows, BSD is for people who love UNIX" "Social Engineer -> Because there is no patch for human stupidity" _______________________________________________ Python-es mailing list [email protected] http://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/
