Lección 4 Excepciones y Bibliotecas
Veremos las Excepciones que se presentan en python, y las librerías
- Excepciones
- Errores de tiempo de ejecución
try
else
- Crear una función para obtener un número entero
pass
- Resumiendo
Excepciones]
Las excepciones son cosas que van mal en nuestra codificación.
En nuestro editor de texto, escriba
code hello.py
otouch hello.py
para crear un nuevo archivo. Escriba lo siguiente (con los errores intencionales incluidos):print("hello, world)
Observe que intencionalmente omitimos una comilla.
Al ejecutarse
python hello.py
opython3 hello.py
en nuestra ventana de terminal, se genera un error. El compilador indica que se trata de un “error de sintaxis”. Los errores de sintaxis son aquellos que requieren que usted vuelva a verificar que haya escrito la corrección del código.Puede obtener más información en la documentación de Errores y excepciones de Python .
Errores de tiempo de ejecución
Los errores de tiempo de ejecución se refieren a aquellos creados por un comportamiento inesperado dentro de su código. Por ejemplo, quizás pretendías que un usuario ingresara un número, pero en su lugar ingresa un carácter. Su programa puede generar un error debido a esta entrada inesperada del usuario.
En la ventana de su terminal, ejecute
code number.py
otouch number.py
. Codifique de la siguiente manera en su editor de texto:x = int(input("What's x? ")) print(f"x is {x}")
Observe que al incluir
f
, le decimos a Python que interpola lo que está entre llaves como el valor dex
. Además, al probar su código, puede imaginar cómo se podría escribir fácilmente una cadena o un carácter en lugar de un número. Aún así, un usuario no podría escribir nada en absoluto, simplemente presionando la tecla Intro.Como programadores, debemos estar a la defensiva para asegurarnos de que nuestros usuarios ingresen lo que esperábamos. Podríamos considerar “casos de esquina” como
-1
,0
ocat
.Si ejecutamos este programa y escribimos "cat", de repente veremos.
ValueError: invalid literal for int() with base 10: 'cat'
Esencialmente, al intérprete de Python no le gusta que hayamos pasado "cat" a laprint
función.Una estrategia eficaz para corregir este posible error sería crear un "manejo de errores" para garantizar que el usuario se comporte como pretendemos.
Puede obtener más información en la documentación de Errores y excepciones de Python .
try
En Python
try
,except
son formas de probar la entrada del usuario antes de que algo salga mal. Modifique su código de la siguiente manera:try: x = int(input("What's x?")) print(f"x is {x}") except ValueError: print("x is not an integer")
Observe cómo, al ejecutar este código,
50
se aceptará la entrada. Sin embargo, al escribircat
se producirá un error visible para el usuario, indicándole por qué no se aceptó su entrada.Esta todavía no es la mejor manera de implementar este código. Observe que estamos intentando hacer dos líneas de código. Para seguir las mejores prácticas, solo debemos usar
try
la menor cantidad posible de líneas de código que nos preocupe que puedan fallar. Ajuste su código de la siguiente manera:try: x = int(input("What's x?")) except ValueError: print("x is not an integer") print(f"x is {x}")
Observe que si bien esto logra nuestro objetivo de intentar la menor cantidad de líneas posible, ¡ahora nos enfrentamos a un nuevo error! Nos enfrentamos a un
NameError
dóndex is not defined
. Mire este código y considere: ¿Por qué x no está definido en algunos casos?De hecho, si examina el orden de las operaciones en
x = int(input("What's x?"))
, de derecha a izquierda, podría tomar un carácter ingresado incorrectamente e intentar asignarlo como un número entero. Si esto falla, la asignación del valor dex
nunca ocurre. Por lo tanto, no hay ninguna x para imprimir en nuestra última línea de código.
else
Resulta que hay otra forma de implementar
try
que podría detectar errores de esta naturaleza.Ajuste su código de la siguiente manera:
try: x = int(input("What's x?")) except ValueError: print("x is not an integer") else: print(f"x is {x}")
Tenga en cuenta que si no se produce ninguna excepción, ejecutará el bloque de código dentro de
else
. Ejecutandopython number.py
y suministrando50
, notarás que se imprimirá el resultado. Al intentarlo de nuevo, esta vez proporcionandocat
, notarás que el programa ahora detecta el error.Al considerar mejorar nuestro código, observe que estamos siendo un poco groseros con nuestro usuario. Si nuestro usuario no coopera, actualmente simplemente finalizamos nuestro programa. ¡Considere cómo podemos usar un bucle para solicitar al usuario
x
y si no vuelve a solicitarlo! Mejore su código de la siguiente manera:while True: try: x = int(input("What's x?")) except ValueError: print("x is not an integer") else: break print(f"x is {x}")
Observe que esto
while True
se repetirá para siempre. Si el usuario logra proporcionar la entrada correcta, podemos salir del bucle y luego imprimir la salida. Ahora, a un usuario que ingrese algo incorrectamente se le pedirá información nuevamente.
Crear una función para obtener un número entero
Seguramente, hay muchas veces que querríamos obtener un número entero de nuestro usuario. Modifique su código de la siguiente manera:
def main(): x = get_int() print(f"x is {x}") def get_int(): while True: try: x = int(input("What's x?")) except ValueError: print("x is not an integer") else: break return x main()
Note que estamos manifestando muchas grandes propiedades. Primero, hemos abstraído la capacidad de obtener un número entero. Ahora, todo este programa se reduce a las primeras tres líneas del programa.
Aún así, podemos mejorar este programa. Considere qué más podría hacer para mejorar este programa. Modifique su código de la siguiente manera:
def main(): x = get_int() print(f"x is {x}") def get_int(): while True: try: x = int(input("What's x?")) except ValueError: print("x is not an integer") else: return x main()
Tenga en cuenta que esto
return
no sólo le sacará del bucle, sino que también le devolverá un valor.Algunas personas pueden argumentar que se podría hacer lo siguiente:
def main(): x = get_int() print(f"x is {x}") def get_int(): while True: try: return int(input("What's x?")) except ValueError: print("x is not an integer") main()
Observe que esto hace lo mismo que la iteración anterior de nuestro código, simplemente con menos líneas.
pass
Podemos hacer que nuestro código no advierta a nuestro usuario, sino que simplemente le vuelva a hacer nuestra pregunta modificando nuestro código de la siguiente manera:
def main(): x = get_int() print(f"x is {x}") def get_int(): while True: try: return int(input("What's x?")) except ValueError: pass main()
Tenga en cuenta que nuestro código seguirá funcionando pero no informará repetidamente al usuario de su error. En algunos casos, querrá dejar muy claro al usuario qué error se está produciendo. Otras veces, es posible que decidas que simplemente quieres pedirles su opinión nuevamente.
Un último refinamiento que podría mejorar la implementación de esta
get_int
función. En este momento, observe que actualmente confiamos en el sistema de honor que existex
tanto en las funcionesmain
comoget_int
. Probablemente queramos pasar un mensaje que el usuario vea cuando se le solicite información. Modifique su código de la siguiente manera.def main(): x = get_int("What's x? ") print(f"x is {x}") def get_int(prompt): while True: try: return int(input(prompt)) except ValueError: pass main()
Puede obtener más información en la documentación de Python de
pass
.
Resumiendo
Los errores son inevitables en su código. Sin embargo, tiene la oportunidad de utilizar lo aprendido hoy para ayudar a prevenir estos errores. En esta conferencia aprendiste sobre...
- Excepciones
- Errores de valor
- Errores de tiempo de ejecución
try
else
pass
Bibliotecas libraries
- Bibliotecas
- aleatorio
random
- Estadísticas
statistics
- Argumentos de línea de comando
slice
- Paquetes
packages
- API
- Creando tus propias bibliotecas
- Resumiendo
Libraries
- Generalmente, las bibliotecas son fragmentos de código escritos por usted u otras personas que puede usar en su programa.
- Python le permite compartir funciones o características con otros como "módulos".
- Si copia y pega código de un proyecto antiguo, es probable que pueda crear un módulo o biblioteca que pueda incorporar a su nuevo proyecto.
aleatorio random
random
es una biblioteca que viene con Python y que puedes importar a tu propio proyecto.Como codificador, es más fácil apoyarse en los hombros de codificadores anteriores.
Entonces, ¿cómo cargas un módulo en tu propio programa? Puedes usar la palabra
import
en tu programa.Dentro del
random
módulo, hay una función integrada llamadarandom.choice(seq)
.random
es el módulo que está importando. Dentro de ese módulo, está lachoice
función. Esa función toma en cuenta unaseq
secuencia o que es una lista.En la ventana de su terminal escriba
code generate.py
. En su editor de texto, codifique de la siguiente manera:import random coin = random.choice(["heads", "tails"]) print(coin)
Observe que la lista
choice
contiene llaves cuadradas, comillas y una coma. Dado que aprobó dos elementos, Python hace los cálculos y le da un 50% de posibilidades de obtener cara y cruz. Al ejecutar su código, notará que este código, de hecho, funciona bien.Podemos mejorar nuestro código.
from
nos permite ser muy específicos sobre lo que nos gustaría importar. Antes, nuestraimport
línea de código trae el contenido completo de las funciones derandom
. Sin embargo, ¿qué pasa si solo queremos cargar una pequeña parte de un módulo? Modifique su código de la siguiente manera:from random import choice coin = choice(["heads", "tails"]) print(coin)
Observe que ahora podemos importar solo la
choice
función derandom
. A partir de ese momento, ya no necesitamos codificarrandom.choice
. Ahora sólo podemos codificarchoice
solos.choice
se carga explícitamente en nuestro programa. ¡Esto ahorra recursos del sistema y potencialmente puede hacer que nuestro código se ejecute más rápido!Continuando, considere la función
random.randint(a, b)
. Esta función generará un número aleatorio entrea
yb
. Modifique su código de la siguiente manera:import random number = random.randint(1, 10) print(number)
Observe que nuestro código generará aleatoriamente un número entre
1
y10
.Podemos introducirlo en nuestra tarjeta
random.shuffle(x)
donde se barajará una lista en orden aleatorio.import random cards = ["jack", "queen", "king"] random.shuffle(cards) for card in cards: print(card)
Observe que
random.shuffle
se barajan las cartas en su lugar. A diferencia de otras funciones, no devolverá un valor. En cambio, tomará lacards
lista y los mezclará dentro de esa lista. Ejecute su código varias veces para ver cómo funciona.Ahora tenemos estas tres formas anteriores de generar información aleatoria.
Puede obtener más información en la documentación de Python de
random
.
Estadísticas statistics
Python viene con una biblioteca incorporada
statistics
. ¿Cómo podríamos utilizar este módulo?average
Es una función de esta biblioteca que es bastante útil. En la ventana de su terminal, escribacode average.py
. En la ventana del editor de texto, modifique su código de la siguiente manera:import statistics print(statistics.mean([100, 90]))
Observe que importamos una biblioteca diferente llamada
statistics
. Lamean
función toma una lista de valores. Esto imprimirá el promedio de estos valores. En la ventana de su terminal, escribapython average.py
.Considere las posibilidades de utilizar el
statistics
módulo en sus propios programas.Puede obtener más información en la documentación de Python de
statistics
.
Argumentos de línea de comando
Hasta ahora, hemos estado proporcionando todos los valores dentro del programa que hemos creado. ¿Qué pasaría si quisiéramos poder recibir información desde la línea de comandos? Por ejemplo, en lugar de escribir
python average.py
en la terminal, ¿qué pasaría si quisiéramos poder escribirpython average.py 100 90
y obtener el promedio entre100
y90
?sys
es un módulo que nos permite tomar argumentos en la línea de comando.argv
es una función dentro delsys
módulo que nos permite conocer lo que el usuario escribió en la línea de comando. Observe cómo lo verásys.argv
utilizado en el código siguiente. En la ventana de terminal, escribacode name.py
touch name.py
. En el editor de texto, codifique de la siguiente manera:import sys print("hello, my name is", sys.argv[1])
Observe que el programa observará lo que el usuario escribió en la línea de comando. Actualmente, si escribe
python name.py David
en la ventana de la terminal, veráhello, my name is David
. Observe que ahísys.argv[1]
es dondeDavid
se almacena. ¿Porqué es eso? Bueno, en lecciones anteriores quizás recuerdes que las listas comienzan en el0
elemento número 1. ¿En qué crees que se celebra actualmentesys.argv[0]
? Si lo adivinastename.py
, ¡estarías en lo cierto!Hay un pequeño problema con nuestro programa tal como está. ¿Qué pasa si el usuario no escribe el nombre en la línea de comando? Inténtalo tú mismo. Escribe
python name.py
en la ventana de la terminal.list index out of range
El compilador presentará un error . ¡La razón de esto es que no hay nadasys.argv[1]
porque no se escribió nada! Así es como podemos proteger nuestro programa de este tipo de error:import sys try: print("hello, my name is", sys.argv[1]) except IndexError: print("Too few arguments")
Tenga en cuenta que ahora se le solicitará al usuario una sugerencia útil sobre cómo hacer que el programa funcione si olvida escribir un nombre. Sin embargo, ¿podríamos estar más a la defensiva para asegurarnos de que el usuario ingrese los valores correctos?
Nuestro programa se puede mejorar de la siguiente manera:
import sys if len(sys.argv) < 2: print("Too few arguments") elif len(sys.argv) > 2: print("Too many arguments") else: print("hello, my name is", sys.argv[1])
Observe cómo, si prueba su código, verá cómo se manejan estas excepciones, brindando al usuario consejos más refinados. Incluso si el usuario escribe demasiados o muy pocos argumentos, se le proporcionan instrucciones claras sobre cómo solucionar el problema.
En este momento, nuestro código es lógicamente correcto. Sin embargo, hay algo muy bueno en mantener nuestra verificación de errores separada del resto de nuestro código. ¿Cómo podríamos separar nuestro manejo de errores? Modifique su código de la siguiente manera:
import sys if len(sys.argv) < 2: sys.exit("Too few arguments") elif len(sys.argv) > 2: sys.exit("Too many arguments") print("hello, my name is", sys.argv[1])
Observe cómo estamos usando una función incorporada de
sys
llamadoexit
que nos permite salir del programa si el usuario introdujo un error. Ahora podemos estar seguros de que el programa nunca ejecutará la última línea de código y provocará un error. Por lo tanto,sys.argv
proporciona una forma mediante la cual los usuarios pueden introducir información desde la línea de comando.sys.exit
proporciona un medio por el cual el programa puede salir si surge un error.Puede obtener más información en la documentación de Python de
sys
.
slice
slice
es un comando que nos permite tomar alist
y decirle al compilador dónde queremos que el compilador considere el iniciolist
y el final delist
. Por ejemplo, modifique su código de la siguiente manera:import sys if len(sys.argv) < 2: sys.exit("Too few arguments") for arg in sys.argv: print("hello, my name is", arg)
Tenga en cuenta que si escribe
python name.py David Carter Rongxin
en la ventana de la terminal, el compilador generará no solo la salida deseada de los nombres, sino tambiénhello, my name is name.py
. Entonces, ¿cómo podríamos asegurarnos de que el compilador ignore el primer elemento de la lista dondename.py
se está almacenando actualmente?slice
¡Se puede emplear en nuestro código para comenzar la lista en algún lugar diferente! Modifique su código de la siguiente manera:import sys if len(sys.argv) < 2: sys.exit("Too few arguments") for arg in sys.argv[1:]: print("hello, my name is", arg)
Observe que en lugar de comenzar la lista en
0
, usamos corchetes para indicarle al compilador que comience en1
y vaya hasta el final usando el1:
argumento. Al ejecutar este código, notará que podemos mejorar nuestro código usando una sintaxis relativamente simple.
Paquetes
Una de las razones por las que Python es tan popular es que existen numerosas bibliotecas potentes de terceros que agregan funcionalidad. A estas bibliotecas de terceros, implementadas como una carpeta, las llamamos "paquetes".
PyPI es un repositorio o directorio de todos los paquetes de terceros disponibles actualmente.
cowsay
es un paquete muy conocido que permite que una vaca hable con el usuario.Python tiene un administrador de paquetes llamado
pip
que le permite instalar paquetes rápidamente en su sistema.En la ventana de la terminal, puede instalar el
cowsay
paquete escribiendopip install cowsay
. Después de un poco de resultados, ahora puede comenzar a utilizar este paquete en su código.En la ventana de su terminal escriba
code say.py
otouch say.py
. En el editor de texto, codifique de la siguiente manera:import cowsay import sys if len(sys.argv) == 2: cowsay.cow("hello, " + sys.argv[1])
Observe que el programa primero verifica que el usuario haya ingresado al menos dos argumentos en la línea de comando. Entonces, la vaca debería hablar con el usuario. Escribe
python say.py David
y verás una vaca diciendo "hola" a David.Modifique aún más su código:
import cowsay import sys if len(sys.argv) == 2: cowsay.trex("hello, " + sys.argv[1])
Observe que un t-rex ahora dice "hola".
Ahora puede ver cómo puede instalar paquetes de terceros.
Puede obtener más información en la entrada de PyPI para
cowsay
Puede encontrar otros paquetes de terceros en PyPI
API
Las API o “interfaces de programas de aplicaciones” le permiten conectarse al código de otros.
requests
es un paquete que permite que su programa se comporte como lo haría un navegador web.En tu terminal escribe
pip install requests
. Luego, escribecode itunes.py
otouch itunes.py
.Resulta que Apple iTunes tiene su propia API a la que puedes acceder en tus programas. En su navegador de Internet, puede visitar https://itunes.apple.com/search?entity=song&limit=1&term=weezer y se descargará un archivo de texto. David construyó esta URL leyendo la documentación API de Apple. Observe cómo esta consulta busca un
song
, conlimit
un resultado, que se relacione con elterm
llamadoweezer
. Al observar este archivo de texto que se descarga, es posible que encuentre que el formato es similar al que hemos programado anteriormente en Python.El formato del archivo de texto descargado se llama JSON, un formato basado en texto que se utiliza para intercambiar datos basados en texto entre aplicaciones. Literalmente, Apple proporciona un archivo JSON que podemos interpretar en nuestro propio programa Python.
En la ventana de terminal, escriba
code itunes.py
otouch itunes.py
. Codifique de la siguiente manera:import requests import sys if len(sys.argv) != 2: sys.exit() response = requests.get("https://itunes.apple.com/search?entity=song&limit=1&term=" + sys.argv[1]) print(response.json())
Observe cómo el valor devuelto de
requests.get
se almacenará enresponse
. David, después de leer la documentación de Apple sobre esta API, sabe que lo que se devuelve es un archivo JSON. Al ejecutarpython itunes.py weezer
, verá el archivo JSON devuelto por Apple. Sin embargo, Python convierte la respuesta JSON en un diccionario. Mirando el resultado, ¡puede ser bastante vertiginoso!Resulta que Python tiene una biblioteca JSON incorporada que puede ayudarnos a interpretar los datos recibidos. Modifique su código de la siguiente manera:
import json import requests import sys if len(sys.argv) != 2: sys.exit() response = requests.get("https://itunes.apple.com/search?entity=song&limit=1&term=" + sys.argv[1]) print(json.dumps(response.json(), indent=2))
Observe que
json.dumps
se implementa de tal manera que se utilizaindent
para hacer que la salida sea más legible. Al ejecutarpython itunes.py weezer
, verá el mismo archivo JSON. Sin embargo, esta vez es mucho más legible. Observe ahora que verá un diccionario llamadoresults
dentro de la salida. Dentro de ese diccionario llamadoresults
hay numerosas claves presentes. Mire eltrackName
valor en la salida. ¿Qué nombre de pista ves en tus resultados?¿Cómo podríamos simplemente mostrar el nombre de esa pista? Modifique su código de la siguiente manera:
import json import requests import sys if len(sys.argv) != 2: sys.exit() response = requests.get("https://itunes.apple.com/search?entity=song&limit=50&term=" + sys.argv[1]) o = response.json() for result in o["results"]: print(result["trackName"])
Observe cómo tomamos el resultado
response.json()
y lo almacenamoso
(como en la letra minúscula). Luego, iteramos a través deresults
ino
e imprimimos cada unotrackName
. Observe también cómo hemos aumentado el número límite de resultados a50
. Ejecute su programa. Vea los resultados.Puede obtener más información
requests
a través de la documentación de la biblioteca .Puede obtener más información sobre JSON en la documentación de JSON de Python .
Creando tus propias bibliotecas
¡Tienes la capacidad, como programador de Python, de crear tu propia biblioteca!
¡Imagínese situaciones en las que desee reutilizar fragmentos de código una y otra vez o incluso compartirlos con otros!
Hemos estado escribiendo mucho código para decir "hola" hasta ahora en este curso. Creemos un paquete que nos permita decir "hola" y "adiós". En la ventana de su terminal, escriba
code sayings.py
otouch sayings.py
. En el editor de texto, codifique de la siguiente manera:def hello(name): print(f"hello, {name}") def goodbye(name): print(f"goodbye, {name}")
Tenga en cuenta que este código en sí mismo no hace nada por el usuario. Sin embargo, si un programador importara este paquete a su propio programa, las capacidades creadas por las funciones anteriores podrían implementarse en su código.
Veamos cómo podríamos implementar código utilizando este paquete que creamos. En la ventana de terminal, escriba
code say.py
otouch say.py
. En este nuevo archivo en su editor de texto, escriba lo siguiente:import sys from sayings import goodbye if len(sys.argv) == 2: goodbye(sys.argv[1])
Observe que este código importa las capacidades del
goodbye
paquetesayings
. Si el usuario ingresó al menos dos argumentos en la línea de comando, dirá "adiós" junto con la cadena ingresada en la línea de comando.
Resumiendo
Las bibliotecas amplían las capacidades de Python. Algunas bibliotecas se incluyen de forma predeterminada con Python y simplemente es necesario importarlas. Otros son paquetes de terceros que deben instalarse mediante pip
. ¡Puedes crear tus propios paquetes para que los uses tú mismo o los demás! En esta conferencia aprendiste sobre...
- Bibliotecas
- aleatorio
- Estadísticas
- Argumentos de línea de comando
- Rebanada
- Paquetes
- API
- Creando tus propias bibliotecas