[pyar] Ayuda - Nuevo en python - como leer error?

Edgardo edgardolor en gmail.com
Sab Sep 28 16:55:36 -03 2019


Muchas gracias chicos, finalmente lo entendí Y sobre todo entendí COMO LEER
EL ERROR.

Aunque la versión en ingles tampoco es muy explicativa, tenia esperanza de
que el ejemplo sea mas CONCRETO pero es exactamente = a la versión
traducida.

Parece una pavada, pero cuando me hizo el click después de releer sus
respuestas y pasarlo a código nuevamente al fin lo pude entender!!!


Muchas gracias.  😁😁😁

El vie., 27 sept. 2019 a las 21:12, Gustavo Campanelli (<gedece en gmail.com>)
escribió:

>
>
> On Fri, Sep 27, 2019 at 7:13 PM Tordek <kedrot en gmail.com> wrote:
>
>> > 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
>> >> >> >>> _______________________________________________
>>
>> Piensalo de la siguiente forma. En cada lenguaje, aprender a interpretar
> los mensajes de error es un arte tán importante como saber programar. A
> veces lo que reporta el error no es el error en si, es una consecuencia de
> otro error.  Así que el libro está intentando guiarte en los primeros pasos
> de entender como leer los errores y como empezar a corregirlos. En python,
> los Tracebacks se pueden leer de abajo para arriba, El error se produjo en
> esa última línea, y eso fue llamado desde la siguiente linea, que a su vez
> fue llamado desde otra línea. Si comienzas así, se ve que esa última línea
> es la más importante para este error, y las anteriores ayudan a entender
> como estaba funcionando el programa cuando se produjo el error.
>
> Lo que está intentando el autor es explicarte la visibilidad de las
> variables dependiendo del ámbito en que fueron creadas.
>
> Gedece
> _______________________________________________
> 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
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.python.org.ar/pipermail/pyar/attachments/20190928/bab62778/attachment-0001.html>


Más información sobre la lista de distribución pyar