¿Hay alguna forma de construir secuencias perezosas en Python?
-
28-10-2019 - |
Pregunta
Hay una vista de django que carga Member
Objetos de la base de datos con cierto filtro.
Ahora necesito cambiar esta lógica a presentar un específico Member
Primero, y deje que el resto siga en su orden natural.
La forma más directa es ejecutar la consulta de inmediato, obtener una lista, eliminar e insertar el elemento al principio. Sin embargo, tengo más curiosidad Si todavía hay alguna forma de utilizar QuerySet
La naturaleza perezosa.
En C#, escribiría:
IEnumerable<Member> members = db.Members; // db.Members is lazy
members = Enumerable.Union( // construct a lazy sequence that traverses its arguments
new [] { specificMember },
members.Where(m => m != specificMember)
);
Como pasaría un bucle members
, primero obtendría specificMember
y luego usar Cualquier lógica de carga perezosa original db.Members
usó.
¿Hay alguna forma de hacer lo mismo en Django y Python?
Solución
Usar itertools.chain
. Algo como:
import itertools
original_members = .... # get an iterator of the data
members = itertools.chain([specific_member], original_members)
La función de cadena devuelve un iterador. El iterador comienza devolviendo el valor de la secuencia en el primer parámetro, que es una lista de elementos únicos que contiene específico_member. Luego comienza a devolver los valores de original_members
, que supongo que es una secuencia perezosa.