Hay (al menos) dos tipos diferentes de errores: errores de sintaxis y excepciones. Los errores de sintaxis, también conocidos como errores de interpretación, son quizás el tipo de erorres más comunes cuando se arranca con Python. Por ejemplo:
while True print('Hola mundo')
La pequeña flecha señala el primer lugar donde se detectó un error. En este caso, señala a la función print()
, ya que faltan dos puntos (:
) antes de la misma.
Incluso si la declaración o expresión es sintácticamente correcta, puede generar un error cuando se intenta ejecutarla. Los errores detectados durante la ejecución se llaman excepciones. Las excepciones surgen por diferentes tipos de errores al ejecutar código Python. Por ejemplo:
10 * 1/0
1 + 'e'
4 + potencia(3,2)
La lista de excepciones es muy extensa, Python cuenta con excepciones integradas.
while True:
try:
x = int(input("Por favor ingrese un número: "))
break
except ValueError:
print("Oops! No era válido. Intente nuevamente...")
La declaración try
funciona de la siguiente manera:
try
(el código entre las declaración try
y except
).except
se saltea y termina la ejecución de la declaración try
.try
, el resto del bloque se saltea. Luego, si su tipo coincide con la excepción nombrada luego de la palabra reservada except
, se ejecuta el bloque except
, y la ejecución continúa luego de la declaración try
.except
, esta se pasa a declaraciones try
de más afuera; si no se encuentra nada que la maneje, es una excepción no manejada, y la ejecución se frena con un mensaje como los mostrados arriba.Las declaraciones try
,except
tienen un bloque else
opcional, el cual, cuando está presente, debe seguir a los except
. Es útil para aquel código que debe ejecutarse si el bloque try
no genera una excepción.
Veamos una aplicación del uso de exepciones.
Primero forcemos los errores: ZeroDivisionError y ValueError.
print("Dame dos números y yo los dividiré.")
print("Ingrese una q, para salir")
while True:
first_number = input("\nPrimer número: ")
if first_number == 'q':
break
second_number = input("Segundo numero: ")
if second_number == 'q':
break
answer = int(first_number) / int(second_number)
print(answer)
Si ahora contemplamos las excepciones y trabajamos sobre ellas:
print("Dame dos números y yo los dividiré.")
print("Ingrese una q, para salir")
while True:
first_number = input("\nPrimer número: ")
if first_number == 'q':
break
second_number = input("Segundo numero: ")
try:
answer = int(first_number) / int(second_number)
except ZeroDivisionError:
print("No se puede dividir por cero.")
except ValueError:
print("Valores ingresados incorrectos")
else:
print(answer)
El uso de else
es mejor que agregar código adicional en el try porque evita capturar accidentalmente una excepción que no fue generada por el código que está protegido por la declaración try
, except
.
Cuando se usa con un ciclo, el else
tiene más en común con el else
de una declaración try
que con el de un if
: el else
de un try
se ejecuta cuando no se genera ninguna excepción, y el else
de un ciclo se ejecuta cuando no hay ningún break
.
La declaración try
tiene otra cláusula opcional que intenta definir acciones de limpieza, por ejemplo:
def dividir(x, y):
try:
result = x / y
except ZeroDivisionError:
print("¡división por cero!")
else:
print("el resultado es", result)
finally:
print("ejecutando la clausula finally")
Una cláusula finally
siempre es ejecutada antes de salir de la declaración try
, ya sea que una excepción haya ocurrido o no. Cuando ocurre una excepción en la cláusula try
y no fue manejada por una cláusula except
(o ocurrió en una cláusula except
o else
), es relanzada luego de que se ejecuta la cláusula finally
. El finally
es también ejecutado “a la salida” cuando cualquier otra cláusula de la declaración try
es dejada via break
, continue
or return
.
dividir(2, 1)
dividir(2, 0)
divide("2", "1")
Como podés ver, la cláusula finally
es ejecutada siempre. La excepción TypeError lanzada al dividir dos cadenas de texto no es manejado por la cláusula except
y por lo tanto es relanzada luego de que se ejecuta la cláusula finally
.
Nota : En aplicaciones reales, la cláusula
finally
es útil para liberar recursos externos (como archivos o conexiones de red), sin importar si el uso del recurso fue exitoso.
Hasta acá llegamos con los temas propiamente del lenguaje, con lo visto y practicado se está en condiciones de encarar proyectos más ambiciosos, en este sentido recomendamos fuertemente seguir los proyectos del siguiente libro:
Matthes, Eric. Python crash course: a hands-on, project-based introduction to programming. No Starch Press, 2015.
Pero antes de encarar algún proyecto más amplio algunas recomendaciones respecto a la configuración. En la clase 100_instalacion.ipynb, mostramos como instalar Python usando Miniconda. En una instancia inicial es el mejor camino para evitar confusiones y adentrarse en aprender el lenguaje. Pero si llegaste hasta aca siguiendo los notebooks en orden y respetando la dinamica propuesta por los autores, de seguro te estar preguntando como continuar o incluso como tener más control sobre nuestra version de Python y/o paquetes instalados. Por tal motivo a continuacion se presentan algunos aspectos más avanzados de la configuración.
Para comenzar a trabajar con Python (como ya habiamos visto), nuestro sistema operativo deberá tener acceso a su intérprete. Para lo cual:
En el caso de los sistemas Linux, éstos están diseñados para la programación, por lo que Python ya está instalado en la mayoría de las distribuciones del dicho sistema operativo. Abriendo una ventana de terminal (en Ubuntu, presionar ctrl+alt+T
) ingresar python
y debería abrir el intérprete en consola, donde en las primeras líneas figura la versión del mismo (para salir ctrl+D
o ingresar exit()
).
Al igual que en los sistema Linux, Python ya está instalado en la mayoría de los sistemas OS X. Abrir una ventana de terminal e ingresar python
y debería abrir el intérprete en consola, donde en las primeras líneas figura la versión del mismo (para salir ctrl+D
o ingresar exit()
).
Por lo general Windows no viene con Python, por lo que probablemente se deba descargar e instalar. Primero verificar si Python está instalado en el sistema. Abrir una ventana de terminal e ingresar python
, si se abre el intérprete, Python está instalado en el sistema. Sin embargo, probablemente arroje un mensaje de error que indica que Python no es un comando reconocido.
Por lo tanto, descargar desde la página oficial Python Software Foundation el instalador para Windows e instalar, es importante asegurarse de marcar la opción Agregar Python a PATH, lo que facilitará la configuración.
Si no seleccionamos la opción de Agregar Python a PATH, el intérprete no podrá ser llamado desde cualquier instancia del terminal de Windows. En tal caso proceder como recomienda la siguiente publicación, para agregar el intérprete a las variables de entorno del sistema operativo.
Por otra parte en el libro Python crash course: a hands-on, project-based introduction to programming de Matthes Eric presenta una detallada descripción de cómo proceder para cada sistema operativo, el mismo se encuentra en el capítulo 1, página 5.
O se pueden seguir los pasos recomendados en la siguiente guía de Real Python
O package manager en inglés, es un sistema de gestión de paquetes utilizado para instalar y administrar paquetes de software escritos en Python, en particular. Los administradores más conocidos son dos:
Las librerías son elementos programados en Python (incluso optimizados en más bajo nivel) que amplían el abanico de herramientas para desarrollar. Es buena práctica antes de comenzar un proyecto de desarrollo ver las librerías disponibles. En este sentido PyPi tiene un buscador en la web, como en el caso de conda o por consola:
Conda
conda search <package>
Pip
pip search <package>
Python, como la mayoría de los otros lenguajes de programación modernos, tiene su propia forma única de descargar, almacenar y administrar paquetes (o módulos). Hay algunas ubicaciones diferentes donde estos paquetes se pueden instalar en su sistema. Por ejemplo, la mayoría de los paquetes del sistema se almacenan en un directorio secundario de la ruta almacenada en sys.prefix.
Entonces, ¿por qué importan todos estos pequeños detalles?
Es importante saber esto porque, de manera predeterminada, cada proyecto en su sistema utilizará estos mismos directorios para almacenar y recuperar paquetes del sitio (bibliotecas de terceros). A primera vista, esto puede no parecer un gran problema, pero consideremos el siguiente escenario en el que se tiene dos proyectos: ProjectA y ProjectB, los cuales dependen de la misma biblioteca, ProjectC. El problema se hace evidente cuando comenzamos a requerir diferentes versiones de ProjectC. Tal vez ProjectA necesita v1.0.0, mientras que ProjectB requiere la v2.0.0 más reciente, por ejemplo.Dado que los proyectos se almacenan solo por su nombre, no hay diferenciación entre versiones. Por lo tanto, ambos proyectos, el Proyecto A y el Proyecto B, tendrían que usar la misma versión, lo cual es inaceptable en muchos casos.
Aquí es donde entran en juego los entornos virtuales.
Conda también es un administrador de entornos virtuales. Los entornos virtuales son un ambiente creado con el objetivo de aislar recursos como librerías y entornos de ejecución del sistema principal o de otros entornos virtuales. Esto significa que en el mismo sistema, computadora, es posible tener instaladas múltiples versiones de una misma librería sin crear ningún tipo de conflicto. También podemos exportar una lista de paquetes en un archivo con todas las dependencias de nuestro proyecto.
Otro gestor de entornos muy usado es virtualenv.
Para más información una excelente nota sobre este tema en Real Python
Un entorno de desarrollo integrado o entorno de desarrollo interactivo, en inglés Integrated Development Environment (IDE), es una aplicación informática que proporciona servicios integrales para facilitarle al desarrollador o programador el desarrollo de software. Hay un gran número de ellos, muy diversos, especificos, cubriendo la mayoría de las necesidades. Mencionamos algunos de los más utilizandos con Python:
Este documento se destribuye con una licencia Atribución CompartirIgual 4.0 Internacional de Creative Commons.
© 2020. Infiniem Labs Acústica. infiniemlab.dsp@gmail.com (CC BY-SA 4.0))