[pyar] Ayuda - Nuevo en python - como leer error?
Tordek
kedrot en gmail.com
Vie Sep 27 19:13:27 -03 2019
> Gracias @Tordek pero el código no es mio es el que se usa como ejemplo en el libro.
Por eso puse "El código que pusiste" y no "tu código".
Estas son las funciones que define el libro:
> No hay forma de que pueda reproducir ese error.
>>> def imprimeDoble(paso):
print(paso, paso)
>>> def catDoble(parte1, parte2):
cat = parte1 + parte2
imprimeDoble(cat)
>>> cantus1 = "foo"
>>> cantus2 = "bar"
>>> catDoble(cantus1, cantus2)
foobar foobar
Inmediatamente antes del traceback te dice "Si intentamos acceder a
cat desde imprimeDoble vemos esto"
El ejemplo supone que definiste por error:
>>> def imprimeDoble(paso):
print(cat)
Si ahora corrés la línea, ves el error que indica el libro:
>>> catDoble(cantus1, cantus2)
Traceback (most recent call last):
File "<pyshell#13>", line 1, in <module>
catDoble(cantus1, cantus2)
File "<pyshell#7>", line 3, in catDoble
imprimeDoble(cat)
File "<pyshell#12>", line 2, in imprimeDoble
print(cat)
NameError: name 'cat' is not defined
>>>
> Sigo con la duda de QUE QUISO EXPLICAR EL AUTOR
Te dice "si hubieras cometido un error, verías esto"
On Fri, 27 Sep 2019 at 18:32, Edgardo <edgardolor en gmail.com> wrote:
>
> Gracias @Tordek pero el código no es mio es el que se usa como ejemplo en el libro.
>
> No hay forma de que pueda reproducir ese error. Esta en el cap 3 por si lo queres ver: http://greenteapress.com/thinkpython2/thinkpython2.pdf
>
> Sigo con la duda de QUE QUISO EXPLICAR EL AUTOR, porque no queda claro por la forma en como viene explicando las funciones/variables a lo largo del cap.
>
> El vie., 27 sept. 2019 a las 17:00, Tordek (<kedrot en gmail.com>) escribió:
>>
>> Un problema que tenés es que el código que pusiste no coincide con lo
>> que indica el error:
>>
>> Según tu mail, tenés
>>
>> def imprimeDoble(paso):
>> print paso, paso
>>
>> def catDoble(parte1, parte2):
>> cat = parte1 + parte2
>> imprimeDoble(cat)
>>
>> Que no tiene ningún error; por otro lado, según el error,
>> `imprimeDoble` está definido así:
>>
>> def imprimeDoble(paso):
>> print cat
>>
>> Si corrés eso en el intérprete te da el error que pusiste. Supongo que
>> en algún lado dirá "Si la función imprimeDoble tuviera un error,
>> veríamos esto", o similar.
>>
>> --
>> Tordek
>>
>> On Fri, 27 Sep 2019 at 16:48, Edgardo <edgardolor en gmail.com> wrote:
>> >
>> > Gracias por tu respuesta @Tordek pero mi duda viene a raiz de que yo intento reproducir el error (ver mi mail anterior) y no me da igual al del libro.
>> >
>> > Tampoco en el libro te detalla la serie de pasos que hace para conseguir ese error solo detalla el "que pasaría si..."
>> >
>> > Sigo con la duda. Gracias.
>> >
>> > El vie., 27 sept. 2019 a las 16:42, Tordek (<kedrot en gmail.com>) escribió:
>> >>
>> >> > Lo que yo entiendo es que en _main_ se hizo una llamada a ImprimeDoble y se le paso un argumento que quiere hacer referencia a una variable local definida en otra función
>> >>
>> >> No. La primera linea del trace te dice: en `__main__` se llamó a
>> >> catDoble(cantus1, cantus2). Después pasaron otras cosas y `catDoble`
>> >> llamó a `imprimeDoble`, después pasaron otras cosas, y `imprimeDoble`
>> >> llamó a `print cat`, y ahí saltó el error: `cat` no existe en el
>> >> contexto de `imprimeDoble`.
>> >>
>> >> El error ocurre ahí: esa función quiere imprimir esa variable, pero no existe.
>> >>
>> >> El traceback lo podés leer de abajo hacia arriba, como te dijo Damian:
>> >> En el lugar que te indica la última línea es donde finalmente ocurrió
>> >> el problema; la línea anterior a esa te dice quién llamó a esa
>> >> función, y así sucesivamente.
>> >>
>> >> > ¿Por que mostrar en el traceback catDoble cuando acá no tiene nada que ver a diferencia de main e ImprimeDoble?
>> >>
>> >> Porque está en el camino de las llamadas. `__main__` no llamó a
>> >> `imprimeDoble`; `main` solo llamó a `catDoble` y `catDoble` a
>> >> `imprimeDoble`. Saber la cadena de llamadas te sirve para analizar el
>> >> problema; en este caso particular no te ayuda (pero si vamos al caso,
>> >> tampoco te ayuda saber que `__main__` estaba involucrado), pero si
>> >> tenés una cadena de 10 llamadas y el problema es que en algún lado se
>> >> cambió el parámetro que pasaste, querés saber qué funciones estuvieron
>> >> involucradas para poder revisarlas.
>> >>
>> >> Saludos
>> >> --
>> >> Tordek
>> >>
>> >> On Fri, 27 Sep 2019 at 14:48, Edgardo <edgardolor en gmail.com> wrote:
>> >> >
>> >> > @Damian Castro
>> >> >
>> >> > Creo que me acabo de marear mas con tu explicación. Vamos por partes:
>> >> >
>> >> > 1) ¿Porque el error ocurre en File "test.py", line 9, in imprimeDoble si la llamada a la función se realiza en la ultima linea de código del archivo? ¿No debería ser esta el numero de linea mas alto?
>> >> >
>> >> > 2) No entiendo porque Python me muestra la funcion que llama a ImprimeDoble como parte del traceback si en este caso no se esta llamando a la función catDoble. Lo que yo entiendo es que en _main_ se hizo una llamada a ImprimeDoble y se le paso un argumento que quiere hacer referencia a una variable local definida en otra función, entonces ¿Porque no solo mostrar el error de que ImprimeDoble no puede llamar a una variable local de otra funciona?
>> >> > ¿Porque mostrar en el traceback catDoble cuando acá no tiene nada que ver a diferencia de main e ImprimeDoble?
>> >> >
>> >> > Se entiende mi duda?
>> >> >
>> >> > @Carlos Miguel Farias el código pegado esta sacado del libro, en mi Ubuntu uso python3 ;)
>> >> >
>> >> > Mil gracias, chicos.
>> >> >
>> >> > El vie., 27 sept. 2019 a las 3:04, Damián Castro (<ltdicai en gmail.com>) escribió:
>> >> >>
>> >> >> Hola Edgardo, el traceback generalmente se lee de abajo hacia arriba, siendo la última línea el error en sí, mientras que las anteriores indican la ejecución del código que llevó a ese error. En ese ejemplo:
>> >> >>
>> >> >>> File "test.py", line 9, in imprimeDoble
>> >> >>> print cat
>> >> >>>
>> >> >>> NameError: cat
>> >> >>
>> >> >>
>> >> >> Indica que se produjo un error del tipo NameError en la línea 9 del archivo test.py dentro de la función imprimeDoble. Ahora bien, si queremos saber cuándo se llamó a esa función vemos las líneas encima:
>> >> >>
>> >> >>> File "test.py", line 5, in catDoble
>> >> >>> imprimeDoble(cat)
>> >> >>
>> >> >>
>> >> >> Ahí dice que se llamó a la función imprimeDoble en la línea 5 del mismo archivo, dentro de la función catDoble. Siguiendo la misma idea, vemos cuándo se llama a catDoble mirando las primeras líneas:
>> >> >>
>> >> >>> File "test.py", line 13, in __main__
>> >> >>> catDoble(cantus1, cantus2)
>> >> >>
>> >> >>
>> >> >> Efectivamente se llamó a catDoble en el mismo archivo pero en la línea 13 dentro de la función __main__, o sea la principal.
>> >> >>
>> >> >> Entonces, con todo esto podés armar el flujo de ejecución para poder detectar el porqué del error: catDoble() -> imprimeDoble() -> print cat -> NameError
>> >> >>
>> >> >> Espero que esto te ayude
>> >> >>
>> >> >> Saludos,
>> >> >> Damián
>> >> >>
>> >> >> El vie., 27 de sep. de 2019 a la(s) 02:41, Edgardo (edgardolor en gmail.com) escribió:
>> >> >>>
>> >> >>> Buenas noches,
>> >> >>>
>> >> >>> Les comento que hace algunos años intente aprender a programar y desistí por cuestiones laborales. Hoy por hoy ya con laburo estable estoy volviendo al ruedo. Para ponerlos en contexto, de forma rápida, mi hno de 29 esta casi por la mitad de Ing Industrial en la UTN y al no conseguir laburo se decidió por aprender a programar (después de ver la cant de gente que piden en los portales laborales) y yo de 31 me sume a la voleada ya que si conozco a alguien super capaz y que es inteligente es el.
>> >> >>>
>> >> >>> Estamos leyendo a la par "Aprenda a pensar como un programador con Python" y hasta casi el final del cap 3 veníamos bárbaro, pero es acá donde nos surge la siguiente duda:
>> >> >>>
>> >> >>> El cap define 2 funciones:
>> >> >>>
>> >> >>> 1)
>> >> >>> def imprimeDoble(paso):
>> >> >>> print paso, paso
>> >> >>>
>> >> >>> 2)
>> >> >>> def catDoble(parte1, parte2):
>> >> >>> cat = parte1 + parte2
>> >> >>> imprimeDoble(cat)
>> >> >>>
>> >> >>> Luego hace la llamada a la función 1 y le pasa como argumento la variable local cat, creada solo dentro de catDoble().
>> >> >>>
>> >> >>> Entiendo el PORQUE del error que devuelve python lo que no entiendo es como leerlo, seria el siguiente:
>> >> >>>
>> >> >>> Traceback (innermost last):
>> >> >>> File "test.py", line 13, in __main__
>> >> >>> catDoble(cantus1, cantus2)
>> >> >>> File "test.py", line 5, in catDoble
>> >> >>> imprimeDoble(cat)
>> >> >>> File "test.py", line 9, in imprimeDoble
>> >> >>> print cat
>> >> >>> NameError: cat
>> >> >>>
>> >> >>> Y detalla "Esta lista de funciones de llama traceback (traza inversa). Le dice a usted en
>> >> >>> qué archivo de programa sucedió el error, y en qué lı́nea, y qué funciones se
>> >> >>> ejecutaban en ese momento. También muestra la lı́nea de código que causó el
>> >> >>> error."
>> >> >>>
>> >> >>> Si alguno fuera tan amable de explicarmelo se lo agradecería.
>> >> >>>
>> >> >>> Muchas gracias,
>> >> >>>
>> >> >>> Toty
>> >> >>> _______________________________________________
>> >> >>> Lista de Correo de PyAr - Python Argentina - pyar en python.org.ar
>> >> >>> Sitio web: http://www.python.org.ar/
>> >> >>>
>> >> >>> Para administrar la lista (o desuscribirse) entrar a http://listas.python.org.ar/listinfo/pyar
>> >> >>>
>> >> >>> La lista de PyAr esta Hosteada en USLA - Usuarios de Software Libre de Argentina - http://www.usla.org.ar
>> >> >>
>> >> >> _______________________________________________
>> >> >> Lista de Correo de PyAr - Python Argentina - pyar en python.org.ar
>> >> >> Sitio web: http://www.python.org.ar/
>> >> >>
>> >> >> Para administrar la lista (o desuscribirse) entrar a http://listas.python.org.ar/listinfo/pyar
>> >> >>
>> >> >> La lista de PyAr esta Hosteada en USLA - Usuarios de Software Libre de Argentina - http://www.usla.org.ar
>> >> >
>> >> > _______________________________________________
>> >> > Lista de Correo de PyAr - Python Argentina - pyar en python.org.ar
>> >> > Sitio web: http://www.python.org.ar/
>> >> >
>> >> > Para administrar la lista (o desuscribirse) entrar a http://listas.python.org.ar/listinfo/pyar
>> >> >
>> >> > La lista de PyAr esta Hosteada en USLA - Usuarios de Software Libre de Argentina - http://www.usla.org.ar
>> >> _______________________________________________
>> >> Lista de Correo de PyAr - Python Argentina - pyar en python.org.ar
>> >> Sitio web: http://www.python.org.ar/
>> >>
>> >> Para administrar la lista (o desuscribirse) entrar a http://listas.python.org.ar/listinfo/pyar
>> >>
>> >> La lista de PyAr esta Hosteada en USLA - Usuarios de Software Libre de Argentina - http://www.usla.org.ar
>> >
>> > _______________________________________________
>> > Lista de Correo de PyAr - Python Argentina - pyar en python.org.ar
>> > Sitio web: http://www.python.org.ar/
>> >
>> > Para administrar la lista (o desuscribirse) entrar a http://listas.python.org.ar/listinfo/pyar
>> >
>> > La lista de PyAr esta Hosteada en USLA - Usuarios de Software Libre de Argentina - http://www.usla.org.ar
>> _______________________________________________
>> Lista de Correo de PyAr - Python Argentina - pyar en python.org.ar
>> Sitio web: http://www.python.org.ar/
>>
>> Para administrar la lista (o desuscribirse) entrar a http://listas.python.org.ar/listinfo/pyar
>>
>> La lista de PyAr esta Hosteada en USLA - Usuarios de Software Libre de Argentina - http://www.usla.org.ar
>
> _______________________________________________
> Lista de Correo de PyAr - Python Argentina - pyar en python.org.ar
> Sitio web: http://www.python.org.ar/
>
> Para administrar la lista (o desuscribirse) entrar a http://listas.python.org.ar/listinfo/pyar
>
> La lista de PyAr esta Hosteada en USLA - Usuarios de Software Libre de Argentina - http://www.usla.org.ar
Más información sobre la lista de distribución pyar