Tantas preguntas aquí. Veo al menos dos, tal vez tres:
- ¿Qué hace pop (a, b)? / ¿Por qué hay un segundo argumento?
- ¿Para qué se
*argsutiliza?
La primera pregunta se responde de manera trivial en la referencia de la biblioteca estándar de Python :
pop (tecla [, predeterminado])
Si la clave está en el diccionario, elimínela y devuelva su valor; de lo contrario, devuelva el valor predeterminado. Si no se proporciona el valor predeterminado y la clave no está en el diccionario, se genera un KeyError.
La segunda pregunta se cubre en la Referencia del lenguaje Python :
Si la forma "* identificador" está presente, se inicializa a una tupla que recibe cualquier parámetro posicional en exceso, por defecto a la tupla vacía. Si la forma "** identificador" está presente, se inicializa a un nuevo diccionario que recibe cualquier exceso de argumentos de palabras clave, por defecto a un nuevo diccionario vacío.
En otras palabras, la popfunción toma al menos dos argumentos. A los dos primeros se les asignan los nombres selfy key; y el resto se rellena en una tupla llamada args.
Lo que sucede en la siguiente línea cuando *argsse pasa en la llamada a self.data.popes lo contrario: la tupla *argsse expande a los parámetros posicionales que se transmiten. Esto se explica en la Referencia del lenguaje Python :
Si la sintaxis * expresión aparece en la llamada a la función, la expresión debe evaluarse como una secuencia. Los elementos de esta secuencia se tratan como si fueran argumentos posicionales adicionales
En resumen, a.pop()quiere ser flexible y aceptar cualquier número de parámetros posicionales, de modo que pueda pasar este número desconocido de parámetros posicionales self.data.pop().
Esto le da flexibilidad; datapasa a ser un dictderecho ahora, por lo que self.data.pop()toma uno o dos parámetros; pero si cambiara dataa un tipo que tomara 19 parámetros para una llamada self.data.pop(), no tendría que cambiar la clase aen absoluto. Sin embargo, aún tendría que cambiar cualquier código que llame a.pop()para pasar los 19 parámetros requeridos.
help(b.data.pop)en REPL.