<div dir="ltr">Hola Verónica (y a todos),<div><br></div><div>Ahora ya con las herramientas adecuadas, y ya que estás usando PyCharm, te recomiendo que incluyas tu desarrollo dentro de un main. Así podrás ejecutar y debuggear tu proyecto. Cuando incluyes todo dentro de un main puedes ejecutarlo con el botón "play", y arriba te sale el nombre del script y varios botones: play, debug, correr tests y uno de stop. El segundo te permite debuggear y puedes marcar puntos de quiebre al costado de cada linea. Abajo te salen los valores de las variables, es mucho más fácil a la hora de diagnosticar errores, ver los valores de las variables en todo momento y cosas así.</div><div><br></div><div><div><img src="cid:ii_kc6ja5kw0" alt="image.png" width="562" height="286"><br></div></div><div><br></div><div>Como aún no logro que me funcione la api key me sigue saliendo el mismo error de ayer, y se cae por eso. Después investigaré más y generaré otra api key para ver otros errores que aparezcan.</div><div><br></div><div>Saludos.</div><div> </div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Fri, Jul 3, 2020 at 2:03 PM Alexis Roda <<a href="mailto:alexis.roda.villalonga@gmail.com">alexis.roda.villalonga@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div dir="ltr"><div>Haz este cambio:<br></div><div><br></div></div><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div><span style="font-family:monospace">print(complete_url)  # <<< añade esta línea</span><br></div><div><div><font face="monospace">response = requests.get(complete_url)</font></div></div></blockquote><div dir="ltr"><div><br></div><div>Copia/pega lo que sale por pantalla.</div><div><br></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">Missatge de lemarchand8679 <<a href="mailto:lemarchand8679@gmail.com" target="_blank">lemarchand8679@gmail.com</a>> del dia dv., 3 de jul. 2020 a les 19:40:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="auto"><div dir="auto">Hice como me habían comentado antes, lo de hacer print en x. Lo hice y da el erroe de 401 el cual hace referencia a la api_key. Lo revisé y parece estar correcta, está validada y todo. Probé generando otra y lo mismo; keyerror.</div><div dir="auto"><br></div><div dir="auto"><br></div><div dir="auto"><br></div><div id="gmail-m_1681362217372888514m_-5682182008861312363gmail-m_-8019849770684520672composer_signature" dir="auto"><div style="font-size:85%;color:rgb(87,87,87)" dir="auto">Enviado desde mi smartphone Samsung Galaxy.</div></div><div dir="auto"><br></div><div><br></div><div style="font-size:100%;color:rgb(0,0,0)" dir="auto"><div>-------- Mensaje original --------</div><div>De: Alexis Roda <<a href="mailto:alexis.roda.villalonga@gmail.com" target="_blank">alexis.roda.villalonga@gmail.com</a>> </div><div>Fecha: 3/7/20  11:19  (GMT-03:00) </div><div>A: La lista de python en castellano <<a href="mailto:python-es@python.org" target="_blank">python-es@python.org</a>> </div><div>Asunto: Re: [Python-es] [Consulta] Sobre keyerror </div><div><br></div></div><div dir="ltr"><div dir="ltr"><div dir="ltr"><div>Tiendo a dar demasiada información y perderme en detalles. La parte relevante de mi respuesta es cuando digo que el número 404 y la cadena "404" comparan como distintos. En Python, si comparas un número (un int) y una cadena (un str) el resultado es que siempre son distintos, independientemente de su valor. Esto implica que <b>la rama del else jamás se ejecuta</b>, no importa qué código de respuesta devuelve la API, siempre se ejecuta la rama del then. Esto es un problema cuando la respuesta es no-OK y no contiene la clave "main".</div><div><br></div><div>Lo puedes confirmar fácilmente inspeccionando el valor de x. Si estoy en lo cierto verás algo como {"cod": 123, ...} no {"cod": "123",  ...}. La confirmación definitiva sería la documentación de la API, la especificación del formato de la respuesta.</div><div><br></div><div>Con "la forma correcta" quería decir "la forma recomendada". requests ofrece mecanismos para hacer lo mismo de forma más sencilla y robusta. Ya que se importa se me hace extraño no aprovecharlos.</div><div><br></div><div>También te recomiendo que revises la gestión de errores, parece frágil. Imagino que si el código de respuesta es distingo de 404 no significa necesariamente que la petición ha ido bien. Confirmalo con la documentación de la API.</div><div><br></div><div><br></div><div>Saludos</div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">Missatge de Lemarchand Barker <<a href="mailto:lemarchand8679@gmail.com" target="_blank">lemarchand8679@gmail.com</a>> del dia dv., 3 de jul. 2020 a les 13:36:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="auto"><div>Buenas gracias a todos por sus aportes. Si, me llamo Verónica.</div><div dir="auto">En respuesta a Alexis, puede ser una forma incorrecta de realizar la consulta pero cuando hice copy-paste, al probar con distintas localidades funcionó. Tengo que mirar la info para desarrolladores que tiene más detenidamente, no es larga.</div><div dir="auto">Yo al 404 lo entiendo como el de page not found, de ahí que el else te diga que no encontró la ciudad. No encuentra la página con la información de esa localidad.<br><div dir="auto"><br></div><br><br><div class="gmail_quote" dir="auto"><div dir="ltr" class="gmail_attr">El vie., 3 de jul. de 2020 04:33, Alexis Roda <<a href="mailto:alexis.roda.villalonga@gmail.com" target="_blank">alexis.roda.villalonga@gmail.com</a>> escribió:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr">Si python dice "KeyError: main" al ejecutar y = x["main"] es que x no tiene la clave "main". Averigua el valor de x, tal vez te dé una pista del problema.<div><br></div><div>En el otro mensaje, al cambiar "main" por "cod" el error era "int value is not subscriptable" (o algo parecido), eso nos dice que el valor asociado a la clave "cod" es un número (habría que confirmarlo con la documentación de la API) pero el programa lo trata como una cadena (en el <font face="monospace">if x["cod"] != "404"</font>). El número 404 y la cadena "404" comparan como distintos. No sé si tiene que ver con el KeyError main pero es un error que habría que corregir. Relacionado con esto, no parece buena idea asumir que si el código es distinto de 404 la petición ha ido bien. Asumiendo que sean códigos HTTP yo haría algo como: si cod == 200 procesamiento ok sino si cod == 404 imprime "no encontrado" ... sino imprime "error desconocido".</div><div><br></div><div>Me llama la atención que el script utilice el paquete requests para luego acabar construyendo la URL a mano. Por otro lado la URL que construye no parece muy correcta. Suponiendo que nombre_ciudad sea FOO:</div><div><br></div></div></div></div><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div><div><div><div><font face="monospace">url = "<a href="http://api.openweathermap.org/data/2.5/weather?q=sp" rel="noreferrer" target="_blank">http://api.openweathermap.org/data/2.5/weather?q=sp</a>"</font></div></div></div></div><div><div><div><div><font face="monospace">complete_url = url + "appid=" + api_key + "&q=sp" + nombre_ciudad</font></div></div></div></div></blockquote><div dir="ltr"><div dir="ltr"><div dir="ltr"><div><br></div><div>al final complete_url vale <font face="monospace"><a href="http://api.openweathermap.org/data/2.5/weather?q=spappid=API_KEY&q=spFOO" rel="noreferrer" target="_blank">http://api.openweathermap.org/data/2.5/weather?q=spappid=API_KEY&q=spFOO</a></font>. Creo que deberia ser algo mas parecido a <font face="monospace"><a href="http://api.openweathermap.org/data/2.5/weather?q=FOO&appid=API_KEY&lang=sp" rel="noreferrer" target="_blank">http://api.openweathermap.org/data/2.5/weather?q=FOO&appid=API_KEY&lang=sp</a></font>.</div><div><br></div><div>Usando requests de forma correcta te quitas problemas:</div><div><br></div></div></div></div></div></div><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div><font face="monospace">url = "<a href="http://api.openweathermap.org/data/2.5/weather?q=sp" rel="noreferrer" target="_blank">http://api.openweathermap.org/data/2.5/weather</a>"</font></div><div><font face="monospace">response = requests.get(url, data={"q": nombre_ciudad, "lang": "sp", "appid": api_key})</font></div></div></div></div></div></div></blockquote><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div><br></div><div>añadirá el ? y los & donde corresponda, codificará correctamente los valores y no quedarán valores "desparejados" ni claves duplicadas.</div><div><br></div><div>Visto todo esto sigo pensando que el problema es una mala petición a la API que devuelve un código de error que no es gestionado correctamente.</div><div><br></div><div>Respecto a que el problema se produzca cuando escribes el programa a mano y que funciona si copias/pegas. En caso que no sea un error evidente en la transcripción y que el valor de x no te dé ninguna pista, los IDE suelen incluir alguna herramienta para comparar archivos. Comparalos y encuentra que los hace diferentes y puede causar el problema.<br></div><div><br></div><a href="https://www.jetbrains.com/help/pycharm/comparing-files-and-folders.html" rel="noreferrer" target="_blank">https://www.jetbrains.com/help/pycharm/comparing-files-and-folders.html</a></div><div dir="ltr"><br></div><div>Creo que es excesivo para este problema pero es otra herramienta que puede ser útil.</div><div><br></div><div><br></div><div>Saludos</div><div dir="ltr"><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">Missatge de Lemarchand Barker <<a href="mailto:lemarchand8679@gmail.com" rel="noreferrer" target="_blank">lemarchand8679@gmail.com</a>> del dia dv., 3 de jul. 2020 a les 1:22:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div>Hola, el código de api key funciona, porque me registré y lo usé y funcionó.</div><div>Lo de sp fue más que nada para probar, corresponde al Multilingual support. Incluso cuando hice copy-paste del código sin usar el sp, funcionaba perfecto. Lo saqué de acá: <a href="https://openweathermap.org/current" rel="noreferrer" target="_blank">https://openweathermap.org/current</a>. Lo del multilingual está ya casi al final de la página.</div><div>La url que uso es esta: <a href="http://api.openweathermap.org/data/2.5/weather?" rel="noreferrer" target="_blank">api.openweathermap.org/data/2.5/weather?</a> que es la misma que figura en la página. Reitero, el problema me salta cada vez que copio el código de forma manual, con copy-paste ningún problema.</div><div>Saludos<br></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">El jue., 2 jul. 2020 a las 20:00, David Suárez vía Python-es (<<a href="mailto:python-es@python.org" rel="noreferrer" target="_blank">python-es@python.org</a>>) escribió:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div>Vero,</div><div><br></div><div>el problema que veo es que tienes la cadena "sp" de sobra tanto en la variable url como cuando generas complete_url y creo que no deberían ir allí, aunque no he podido checarlo por lo de la llave API.<br></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">El jue., 2 de jul. de 2020 a la(s) 17:30, Lemarchand Barker (<a href="mailto:lemarchand8679@gmail.com" rel="noreferrer" target="_blank">lemarchand8679@gmail.com</a>) escribió:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr">Hola, este es mi código:<br><br>import requests<br>import json<br><br>api_key = "API_KEY"<br><br>url = "<a href="http://api.openweathermap.org/data/2.5/weather?q=sp" rel="noreferrer" target="_blank">http://api.openweathermap.org/data/2.5/weather?q=sp</a>"<br><br>nombre_ciudad = input("Ingrese nombre de la ciudad: ")<br><br>complete_url = url + "appid=" + api_key + "&q=sp" + nombre_ciudad<br><br>response = requests.get(complete_url)<br><br>x = response.json()<br><br>if x["cod"] != "404":<br><br>    y = x["main"]<br><br>    temperatura_actual = y["temp"]<br><br>    celsius = temperatura_actual - 273.15<br><br>    presion_actual = y["pressure"]<br><br>    humedad_actual = y["humidity"]<br><br>    z = x["clima"]<br><br>    descripcion = z[0]["descripcion"]<br><br>    print(f"Temperatura: {celsius}°")<br>    print(f"Presión atmosférica: {presion_actual} hPa")<br>    print(f"Humedad: {humedad_actual} %")<br>    print(f"Descripción: {descripcion}")<br><br>else:<br>    print("Ciudad no encontrada")<br><br>La salida es la siguiente:<br><br>/usr/bin/python3.8 /home/raiden/Programacion/weather/weather.py<br>Ingrese nombre de la ciudad: Rosario<br>Traceback (most recent call last):<br>  File "/home/raiden/Programacion/weather/weather.py", line 18, in <module><br>    y = x["main"]<br><div>KeyError: 'main'</div><div><br></div><div>El código original es este: <a href="https://www.geeksforgeeks.org/python-find-current-weather-of-any-city-using-openweathermap-api/" rel="noreferrer" target="_blank">Python-find-current-weather-of-any-city-using-openweathermap-api/</a></div><div><br></div><div>Saludos y gracias<br></div><br><br>El jue., 2 jul. 2020 a las 18:20, Gerardo Diez (<<a href="mailto:gerardo.diez.garcia@gmail.com" rel="noreferrer" target="_blank">gerardo.diez.garcia@gmail.com</a>>) escribió:<br>><br>> Hola,<br>><br>> No soy precisamente un experto, pero yo normalmente voy poniendo prints /liga por todos lados para que me vaya mostrando el contenido de las cadenas.<br>><br>> No recuerdo muy bien el funcionamiento de input pero puede ser que el string que se esté incorporando lleve un salto de línea final ( \n)?<br>><br>> Si es así mira la función strip<br>><br>> Un saludo<br>><br>> El jue., 2 jul. 2020 22:01, lemarchand8679 <<a href="mailto:lemarchand8679@gmail.com" rel="noreferrer" target="_blank">lemarchand8679@gmail.com</a>> escribió:<br>>><br>>> Hola, había escrito para comentar que había solucionado el inconveniente de KeyError, y es cierto en parte. Digo en parte porque si escribo desde 0 para hacer algunas modificaciones, me tira ese error al introducir una ciudad, y si hago un copy-paste del código funciona y la verdad no se por qué, alguna idea? Gracias<br>>><br>>><br>>><br>>> Enviado desde mi smartphone Samsung Galaxy.<br>>><br>>> _______________________________________________<br>>> Python-es mailing list<br>>> <a href="mailto:Python-es@python.org" rel="noreferrer" target="_blank">Python-es@python.org</a><br>>> <a href="https://mail.python.org/mailman/listinfo/python-es" rel="noreferrer" target="_blank">https://mail.python.org/mailman/listinfo/python-es</a><br>><br>> _______________________________________________<br>> Python-es mailing list<br>> <a href="mailto:Python-es@python.org" rel="noreferrer" target="_blank">Python-es@python.org</a><br>> <a href="https://mail.python.org/mailman/listinfo/python-es" rel="noreferrer" target="_blank">https://mail.python.org/mailman/listinfo/python-es</a></div>
_______________________________________________<br>
Python-es mailing list<br>
<a href="mailto:Python-es@python.org" rel="noreferrer" target="_blank">Python-es@python.org</a><br>
<a href="https://mail.python.org/mailman/listinfo/python-es" rel="noreferrer noreferrer" target="_blank">https://mail.python.org/mailman/listinfo/python-es</a><br>
</blockquote></div>
_______________________________________________<br>
Python-es mailing list<br>
<a href="mailto:Python-es@python.org" rel="noreferrer" target="_blank">Python-es@python.org</a><br>
<a href="https://mail.python.org/mailman/listinfo/python-es" rel="noreferrer noreferrer" target="_blank">https://mail.python.org/mailman/listinfo/python-es</a><br>
</blockquote></div>
_______________________________________________<br>
Python-es mailing list<br>
<a href="mailto:Python-es@python.org" rel="noreferrer" target="_blank">Python-es@python.org</a><br>
<a href="https://mail.python.org/mailman/listinfo/python-es" rel="noreferrer noreferrer" target="_blank">https://mail.python.org/mailman/listinfo/python-es</a><br>
</blockquote></div></div></div></div></div></div></div></div>
_______________________________________________<br>
Python-es mailing list<br>
<a href="mailto:Python-es@python.org" rel="noreferrer" target="_blank">Python-es@python.org</a><br>
<a href="https://mail.python.org/mailman/listinfo/python-es" rel="noreferrer noreferrer" target="_blank">https://mail.python.org/mailman/listinfo/python-es</a><br>
</blockquote></div></div></div>
_______________________________________________<br>
Python-es mailing list<br>
<a href="mailto:Python-es@python.org" target="_blank">Python-es@python.org</a><br>
<a href="https://mail.python.org/mailman/listinfo/python-es" rel="noreferrer" target="_blank">https://mail.python.org/mailman/listinfo/python-es</a><br>
</blockquote></div></div></div></div>
</div>_______________________________________________<br>
Python-es mailing list<br>
<a href="mailto:Python-es@python.org" target="_blank">Python-es@python.org</a><br>
<a href="https://mail.python.org/mailman/listinfo/python-es" rel="noreferrer" target="_blank">https://mail.python.org/mailman/listinfo/python-es</a><br>
</blockquote></div></div>
_______________________________________________<br>
Python-es mailing list<br>
<a href="mailto:Python-es@python.org" target="_blank">Python-es@python.org</a><br>
<a href="https://mail.python.org/mailman/listinfo/python-es" rel="noreferrer" target="_blank">https://mail.python.org/mailman/listinfo/python-es</a><br>
</blockquote></div>