[Python-es] Hackear objeto list
Oswaldo
listas en soft-com.es
Lun Sep 19 13:45:47 CEST 2011
>
> 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
Más información sobre la lista de distribución Python-es