Historia de la cuestión:
La tipificación dinámica es característica de Python desde sus primeras versiones. Esto significa que las variables no están vinculadas a un tipo de dato específico por adelantado, a diferencia de lenguajes como Java o C++. El tipo se determina en tiempo de ejecución.
Problema:
La principal dificultad es la pérdida del control explícito sobre los tipos. Esto complica la detección de errores en la etapa de escritura del código, lo que puede llevar a errores lógicos en tiempo de ejecución, especialmente al escalar el código.
Solución:
Python aborda este problema a través del duck typing (si un objeto se comporta como un pato, entonces es un pato), así como mediante anotaciones de tipos (type hints), aunque las anotaciones no son obligatorias y no se verifican en tiempo de ejecución, sino solo por herramientas externas.
Ejemplo de código:
x = 42 # int x = "foo" # ahora es una cadena def process(val): return val + val print(process(5)) # 10 print(process("ha")) # haha
Características clave:
¿Se puede usar una variable primero como una lista y luego como un número en un mismo bloque de código, y esto provocará un error de sintaxis?
Sí, no habrá error de sintaxis. El error solo ocurrirá al intentar realizar una operación inválida con el nuevo tipo.
x = [1, 2, 3] x = 5 # print(x[0]) # El error solo ocurrirá en esta llamada
¿Garantiza el type hint en Python que la variable siempre tendrá el tipo indicado durante la ejecución?
No, el type hint es solo una sugerencia, el intérprete no la verifica. Solo los linters y mypy pueden verificar los tipos.
def foo(x: int) -> int: return x + 1 foo("string") # no habrá error hasta la llamada
¿Es el tipo de una función también dinámico? ¿Se puede cambiar la firma de una función durante la ejecución?
Una función es un objeto de primer clase. Su tipo se puede redefinir, pero la firma no se puede cambiar (se puede reemplazar la función por una nueva).
def f(): return 5 f = lambda: "abc" print(f()) # 'abc'
Caso negativo
En un proyecto, el tipo de los parámetros de entrada de la función no se verificó, lo que resultó en que los datos de los formularios de los usuarios llegaran como cadenas, mientras que se trabajaba con ellos como si fueran números. Aparecían errores impredecibles en producción.
Ventajas:
Prototipado rápido, funciones cortas, poco boilerplate.
Desventajas:
Difícil de depurar, los errores se manifiestan en los lugares más inesperados y solo con ciertos datos.
Caso positivo
Al utilizar type hints y validación estática de tipos mediante mypy, los problemas se detectaban en la etapa de CI/CD antes de salir a producción.
Ventajas:
Detección temprana de problemas potenciales, fácil mantenibilidad del código.
Desventajas:
Se pierde tiempo en verificaciones adicionales, a veces se agrega un poco de código extra.