UnboundLocalError: local variable 'UI_curses' referenced before assignment

Chema Cortes py en ls-l.org
Vie Sep 9 11:05:54 CEST 2005


Fernando Canizo escribió:
> El 08/sep/2005 a las 16:12 -0300, Harpo me decía:
> 
>>>Esto de las variables de clase y de instancia lo saqué del siguiente
>>>url:
>>>http://www.ibiblio.org/g2swap/byteofpython/read/class-and-object-vars.html
>>
>>
>>Yo siempre que use variables de instancias use self.X para
>>referenciarlas dentro del metodo. Vi el ejemplo que posteaste del libro
>>byteofpython. 
>>
>>Encontre algunos  le tira el mismo error
>>http://www.daniweb.com/techtalkforums/thread31501.html
>>
>>No esta del todo claro...
> 
> 
> Definitivamente algo anda mal con las variables de clase, el código
> que mandé antes funciona de la siguiente manera:
> ======================================================================
> def highlight_previous(self):
> 	UI_curses.listwin.addstr(UI_curses.y, 0, self.list[UI_curses.y],\
> 		curses.A_NORMAL)
> 	if UI_curses.y == 0:
> 		UI_curses.y = self.list.__len__() - 1
> 	else:
> 		UI_curses.y -= 1
> 	UI_curses.listwin.addstr(UI_curses.y, 0, self.list[UI_curses.y],\
> 		curses.A_REVERSE)
> 	UI_curses.listwin.refresh()
> ======================================================================
> 
> Aclaraciones: tanto 'list' como 'y' (list no estaba en el código
> anterior) son variables de clase, definidas en __init__ de la misma
> manera (sólo que una es una lista y la otra es un entero).
> 
> Cuando highlight_previous recibía como parámetro la lista el código
> explotaba, por eso lo agregué a la clase.
> 
> Si pongo todas las referencias a variables de clases con 'UI_curses' o
> con 'self' explota. En cambio, mezclado como está ahora funciona,
> fíjense que 'listwin' e 'y' las accedo con el prefijo 'UI_curses',
> pero a 'list' la debo acceder con 'self' sino explota. (?)
> 
> Realmente no lo entiendo. Pero ahí quedó andando, no lo toques!

Por un lado, tienes el problema de que estás usando como nombre 'list',
un tipo de dato estándar. Por otro, en el código que pusiste en el
primer mensaje:

def highlight_previous(self, list):
    # fix: both highligts will explode when list.__len__ > listwin.maxy
    UI_curses.listwin.addstr(UI_curses.y, 0, list[UI_curses.y],\
            curses.A_NORMAL)
    if UI_curses.y == 0:
        y = list.__len__()
	UI_curses = y - 1    # <<<<<< ERROR <<<<<<<
    else:
        UI_curses.y -= 1
    UI_curses.listwin.addstr(UI_curses.y, 0, list[UI_curses.y], \
            curses.A_REVERSE)
    UI_curses.listwin.refresh()


Te he indicado dónde está el error. Al darle otro valor a la referencia
UI_curses te estás cargando la clases y todas sus variables.

No creo que sea bueno alterar las variables de clase sin necesidad.
Después te va a ser más difícil dar con los fallos que tengas. Si lo
piensas bien, ¿qué importa que sólo vayas a tener una instancia de la
clase? Por decirlo de otro modo, porqué limitar el código a que algún
día te pueda interesar tener más de una instancia.


Como sugerencia adicional, no uses los métodos __len__ de esta forma.
Emplea la función len(), te quedará más legible.



PD: Por si tienes curiosidad, me llamo "Chema" por "José María" :-))




Más información sobre la lista de distribución Python-es