Valores, nombres y estado
Sigue un programa línea por línea y descubre por qué dos nombres pueden apuntar a un mismo objeto que cambia.
AL TERMINAR, PODRÁS
- Distinguir un valor del nombre de una variable
- Predecir el efecto de una asignación y de una mutación
- Representar un trabajo (job) con tipos de datos que tengan sentido
Descripción del diagrama: jobs → ["email", "report"] (apunta a); backlog → ["email", "report"] (apunta a); backlog.append( "report") → ["email", "report"] (modifica)
Un programa es una secuencia de cambios de estado
La ingeniería de software empieza por convertir una petición vaga en un comportamiento preciso.
Relay recibe trabajos (jobs), los recuerda y en algún momento los ejecuta. Un programa describe cómo cambia su estado (state: los datos que recuerda en cada momento); por ejemplo, la cantidad de trabajos pendientes pasa de cero a uno. Python ejecuta las instrucciones (statements) en orden.
Una expresión calcula un valor; una asignación (assignment) le pone un nombre a ese valor. Lee despacio el pequeño programa de abajo y escribe el valor de pending después de cada línea. Este hábito de seguir el programa paso a paso es más útil que memorizar sintaxis sin tener un modelo.
pending = 0
pending = pending + 1
label = "send welcome email"
print(label, pending)
Los tipos tienen significado
Un string (cadena de texto) representa texto, un integer (número entero) representa una cantidad entera y un Boolean (booleano: True o False) representa una decisión de sí o no.
Elegir un tipo es parte de diseñar el sistema: el identificador de un trabajo puede ser texto aunque tenga dígitos, porque nunca vas a sumar dos identificadores. Python comprueba muchas restricciones de tipo mientras el programa se ejecuta. Convertir la entrada de forma explícita hace visibles tus suposiciones.
El string "3" y el integer 3 se comportan distinto. Una conversión que falla te da información: esa entrada no encaja en tu contrato (las reglas que fija tu código sobre la entrada que acepta). Un diccionario (dictionary, dict) agrupa valores relacionados bajo claves (keys): job["attempts"] lee el valor guardado en la clave "attempts", y asignarle un valor lo cambia.
Su método get, como en job.get("owner", "nobody"), devuelve un valor por defecto en lugar de fallar cuando la clave no existe.
job = {"id": "job-1", "attempts": 0, "done": False}
job["attempts"] = job["attempts"] + 1
print(job["attempts"], job.get("owner", "nobody"))
Los nombres son etiquetas, no cajas
Un nombre hace referencia a un objeto.
Una list (lista) es mutable: se puede modificar en el mismo lugar después de creada. Asignar una lista a otro nombre no crea una lista independiente. Si ambos nombres apuntan a la misma lista, agregar un elemento con cualquiera de los dos modifica el objeto compartido.
En cambio, los integers son inmutables: sumarle uno a un integer crea un valor nuevo y vuelve a asociar el nombre a ese valor. Usa una colección nueva cuando el estado deba ser independiente. Antes de ejecutar el ejemplo, predice las dos listas que se imprimirán.
Esta pequeña diferencia explica más adelante errores sorprendentes en cachés, datos de prueba compartidos (test fixtures) y estado compartido entre workers (programas que toman trabajos y los ejecutan).
jobs = ["email"]
alias = jobs
alias.append("report")
print(jobs)
print(alias)
ERROR FRECUENTE
Usar una asignación como si copiara una colección. Una copia superficial (shallow copy) también sigue compartiendo los objetos mutables que estén anidados dentro.
INTÉNTALO TÚ
Crea un trabajo con un nombre de texto, un contador de intentos entero y una bandera booleana de completado. Haz que dos nombres apunten a la misma lista de trabajos, modifica uno y explica el resultado antes de ejecutarlo.
Decide en el laboratorio.
El checkpoint de dos preguntas, tus notas y tu progreso guardado están en el laboratorio. Gratis y sin cuenta.
Abrir en el laboratorio ↗CONÉCTALO CON RELAY
Representa el primer trabajo de Relay con un diccionario (dictionary: pares clave-valor) que tenga id, kind, attempts y status. Anota qué campos pueden cambiar.