Fundamentos de Python: Sintaxis y Tipos de Datos
Python se convirtió en el lingua franca de la automatización, SRE y ciencia de datos. No fue accidente. Su biblioteca estándar cubre el 80% de los casos reales sin instalar nada, y su sintaxis no te pone obstáculos entre el problema y la solución. Eso importa cuando estás depurando un script a las 2 AM.
Esta primera parte de la serie trabaja los conceptos base con ejemplos concretos, los que de verdad aparecen en la administración de sistemas, no los de los libros de texto universitarios.
Declaración de Variables y Tipado Dinámico
Python es de tipado dinámico, a diferencia de C o Java. No declarás si una variable es entero o cadena; el intérprete lo resuelve en tiempo de ejecución. Esto acelera la escritura de scripts de manera brutal, aunque también significa que los errores de tipo aparecen tarde si no prestás atención. Requiere disciplina.
Definamos el estado de un servidor con distintos tipos de datos:
server_hostname = 'api-prod-us-east-1'
uptime_days = 42
cpu_load_average = 1.75
active_services = ['nginx', 'docker', 'postgresql', 'datadog-agent']
exposed_ports = {
'http': 80,
'https': 443,
'ssh': 2222,
'metrics': 8125
}
print(f"""
Análisis de tipos de datos en memoria:
server_hostname es {type(server_hostname)}
uptime_days es {type(uptime_days)}
cpu_load_average es {type(cpu_load_average)}
active_services es {type(active_services)}
exposed_ports es {type(exposed_ports)}
""")
La función type() devuelve la clase real del objeto. Distinguir un list de un dict parece trivial en ejemplos de juguete. En scripts que procesan respuestas de APIs o archivos de configuración, confundir ambas estructuras es exactamente la raíz de los errores en producción que más tiempo me robaron. No estoy exagerando.
Ejemplo Práctico: Inventario Interactivo
La mayoría de los tutoriales enseña Python con variables que no significan nada: x = 5, nombre = "Juan". Es un error pedagógico. Vamos a construir algo útil desde el principio: una herramienta básica de inventario que interactúa con el operador.
El script va a hacer cuatro cosas:
- Solicitar el nombre del servidor o instancia.
- Solicitar el año en el que la instancia fue provisionada.
- Calcular el tiempo de vida operativo basándose en el año actual.
- Emitir un reporte de estado formateado.
Para capturar la entrada del operador usamos input().
# Capturamos el identificador del servidor
instance_id = input("Por favor, ingresa el identificador de la instancia (ej. db-node-01):\n")
Todo lo que input() devuelve es un str. Como necesitamos operar matemáticamente con el año de aprovisionamiento, hay que convertirlo explícitamente con int(). Si el usuario ingresa texto en lugar de un número, el script va a explotar con un ValueError. En una herramienta real habría que manejarlo; por ahora, lo dejamos así para no distraernos.
# Capturamos el año y forzamos su evaluación como entero
provision_year = int(input("Ingresa el año de aprovisionamiento del servidor:\n"))
El año actual lo obtenemos del módulo datetime, que viene en la biblioteca estándar.
from datetime import datetime
Después extraemos solo el año del sistema con now().year:
current_year = datetime.now().year
Resta simple:
operational_years = current_year - provision_year
Y la salida usa f-strings, disponibles desde Python 3.6. Permiten meter expresiones directamente dentro del literal de texto sin concatenaciones torpes.
print(f"[REPORTE] La instancia {instance_id} lleva {operational_years} años en operación desde {provision_year}.")
El Script Completo
from datetime import datetime
instance_id = input("Por favor, ingresa el identificador de la instancia (ej. db-node-01):\n")
provision_year = int(input("Ingresa el año de aprovisionamiento del servidor:\n"))
current_year = datetime.now().year
operational_years = current_year - provision_year
print(f"[REPORTE] La instancia {instance_id} lleva {operational_years} años en operación (Aprovisionada: {provision_year}).")
Una nota sobre estructura: El from datetime import datetime va en la primera línea, no enterrado en el medio del script. Eso es PEP 8: todas las importaciones al inicio del archivo. No es burocracia, es la diferencia entre un script que solo vos podés leer y uno que tu equipo puede mantener cuando estás de vacaciones, o cuando ya no estás en el equipo.