Creo que las opciones deben considerarse estrictamente desde el punto de vista de la persona que llama: ¿qué es lo más probable que tenga que hacer el consumidor?
¿Y cuáles son las características más destacadas de cada colección?
- Se accede a la tupla en orden e inmutable.
- Se accede a la lista en orden y mutable
- Se accede al dict por clave
La lista y la tupla son equivalentes para el acceso, pero la lista es mutable. Bueno, eso no me importa a la persona que llama si voy a desempaquetar inmediatamente los resultados:
score, top_player = play_round(players)
# or
idx, record = find_longest(records)
No hay ninguna razón para que me importe si es una lista o una tupla, y la tupla es más simple en ambos lados.
Por otro lado, si la colección devuelta se mantendrá completa y se usará como colección :
points = calculate_vertices(shape)
points.append(another_point)
# Make a new shape
entonces podría tener sentido que el regreso sea mutable. La homogeneidad también es un factor importante aquí. Digamos que ha escrito una función para buscar una secuencia de patrones repetidos. La información que obtengo es el índice en la secuencia de la primera instancia del patrón, el número de repeticiones y el patrón en sí. Esos no son los mismos tipos de cosas. Aunque podría mantener las piezas juntas, no hay razón para que quiera mutar la colección . Esto no es un list.
Ahora para el diccionario.
el último crea un código más legible porque ha nombrado salidas
Sí, tener claves para los campos hace que los datos heterogéneos sean más explícitos, pero también conlleva cierta molestia. Nuevamente, para el caso de "Solo voy a desempacar las cosas", esto
round_results = play_round(players)
score, top_player = round_results["score"], round_results["top_player"]
(incluso si evita las cadenas literales para las claves), es un trabajo ocupado innecesario en comparación con la versión de tupla.
La pregunta aquí es triple: ¿qué tan compleja es la colección, cuánto tiempo se mantendrá la colección unida y vamos a necesitar usar este mismo tipo de colección en un montón de lugares diferentes?
Sugeriría que un valor de retorno de acceso con clave comienza a tener más sentido que una tupla cuando hay más de unos tres miembros, y especialmente cuando hay anidamiento:
shape["transform"]["raw_matrix"][0, 1]
# vs.
shape[2][4][0, 1]
Eso lleva a la siguiente pregunta: ¿la colección va a dejar este alcance intacto, en algún lugar alejado de la llamada que lo creó? El acceso clave allí ayudará absolutamente a la comprensión.
La tercera pregunta, reutilizar, apunta a un tipo de datos personalizado simple como una cuarta opción que no presentó.
¿La estructura es propiedad exclusiva de esta función? ¿O estás creando el mismo diseño de diccionario en muchos lugares? ¿Es necesario que muchas otras partes del programa operen en esta estructura? Un diseño de diccionario repetido debe factorizarse en una clase. La ventaja es que puede adjuntar el comportamiento: tal vez algunas de las funciones que operan en los datos se encapsulan como métodos.
Una quinta buena opción, ligera, es namedtuple(). Esta es, en esencia, la forma inmutable del valor de retorno del diccionario.