Discussion:
[django] UnboundLocalError que no puedo resolver
Hystrix
2009-10-09 22:24:52 UTC
Permalink
Esto puede ser una huevada pero la verdad que ya no se por donde mirar.

Basicamente, en el modulo de vistas tengo una vista que usa otra, y
cuando quiero llamar de una a la otra me tira en UnboundLocalError.

El codigo relevante es este:

def viaje(request, numero=None):
"Genera un informe detallado de un viaje"
[...]
return render_to_response('contable/viaje.html', {'viaje':
viaje, 'servicios': servicios, 'clie':

def viajes(request):
"Genera listados de viajes por distintos criterios"
clie = 'Todos'
prov = 'Todos'
desde = 'Sin limite'
hasta = 'Sin limite'
paxs = 'Todos'
numerosPedidos = []
if request.GET['numero'] != '':
numerosPedidos = request.GET['numero'].split(',')
if len(numerosPedidos) == 1 and numerosPedidos[0].find('-') < 0:
return viaje(request) #<------- Aca tira el error
UnboundLocalError at /adm/viaj/ local variable 'viaje' referenced
before assignment


para los que prefieren colores: http://dpaste.com/105155/

Se supone que deberia poder llamar a viaje desde ahi, no?

Por su atencion, muchas gracias.
--
Hystrix
Claudio Freire
2009-10-09 22:59:35 UTC
Permalink
Post by Hystrix
"Genera listados de viajes por distintos criterios"
clie = 'Todos'
prov = 'Todos'
desde = 'Sin limite'
hasta = 'Sin limite'
paxs = 'Todos'
numerosPedidos = []
numerosPedidos = request.GET['numero'].split(',')
return viaje(request) #<------- Aca tira el error
UnboundLocalError at /adm/viaj/ local variable 'viaje' referenced
before assignment
Para que diga eso, el código tiene que seguir, ¿hay más código abajo del
return?

En particular, tenés que asignar algo a viaje:

viaje = <algo>

Eso la convierte en local. Cambiale el nombre a la variable local y se
arregla.

Si no, podrías definirla como global, pero eso te traería problemas al
momento de la asignación (seguro no querés cambiar la función global
"viaje")
Hystrix
2009-10-09 23:11:49 UTC
Permalink
Post by Claudio Freire
Para que diga eso, el código tiene que seguir, ¿hay más código abajo del
return?
     viaje = <algo>
Eso la convierte en local. Cambiale el nombre a la variable local y se
arregla.
Si no, podrías definirla como global, pero eso te traería problemas al
momento de la asignación (seguro no querés cambiar la función global
"viaje")
Muchiiiiiisimas gracias Claudio, recordame que te debo una botella de
lo que estes tomando.

No sabia que si usaba el mismo nombre mas adelante en el codigo pasaba
eso. Igual reconozco que no es buena idea usar el mismo nombre para
dos cosas tan distintas. Ahora, ademas de andar, esta mas prolijo.

[OT] Alguien sabe si existen comunidades de programadores de lenguajes
privados tan buenas como esta? Quiero creer que esta comunidad tiene
tan buen nivel gracias en buena parte a que se formo alrededor de un
soft libre? Me estoy mintiendo mucho?
--
Hystrix
Claudio Freire
2009-10-09 23:27:17 UTC
Permalink
Post by Hystrix
Muchiiiiiisimas gracias Claudio, recordame que te debo una botella de
lo que estes tomando.
En este momento, café, espeso... muy... muy espeso.
Post by Hystrix
No sabia que si usaba el mismo nombre mas adelante en el codigo pasaba
eso. Igual reconozco que no es buena idea usar el mismo nombre para
dos cosas tan distintas. Ahora, ademas de andar, esta mas prolijo.
Sí, básicamente si asignás a un nombre, es implícitamente local, y cualquier
acceso a ese nombre es en el scope local.
Si no lo querés local, lo *tenés* que declarar como global, haciendo:

def f(x):
global y
return y

Nadie se acuerda de eso porque es poco seguido que uno *lea* un nombre local
antes de escribirlo, o *escriba* un nombre global antes de leerlo, que es
donde hace falta la declaración explícita.


Capaz que habría que agregar esto a las preguntas frecuentes...

Loading...