[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