Existe-t-il un moyen de construire des séquences paresseuses en Python?
-
28-10-2019 - |
Question
Il existe une vue Django qui charge les objets Member
de la base de données avec un certain filtre.
Je dois maintenant changer cette logique pour présenter d'abord un Member
spécifique, et laisser le reste suivre dans leur ordre naturel .
Le moyen le plus simple est d'exécuter la requête tout de suite, d'obtenir une liste, de supprimer et d'insérer l'élément au début.Cependant, je suis très curieux s'il existe encore un moyen d'utiliser la nature paresseuse de QuerySet
.
En C #, j'écrirais:
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)
);
Comme une boucle passerait par members
, elle obtiendrait d'abord specificMember
, puis utilisait quelle que soit la logique de chargement paresseux db.Members
d'origine utilisée .
Y a-t-il un moyen de faire la même chose avec Django et Python?
La solution
Utilisez itertools.chain
.Quelque chose comme:
import itertools
original_members = .... # get an iterator of the data
members = itertools.chain([specific_member], original_members)
La fonction chain renvoie un itérateur.L'itérateur commence par renvoyer la valeur de la séquence dans le premier paramètre, qui est une liste à un seul élément contenant specific_member.Ensuite, il commence à renvoyer les valeurs de original_members
, ce qui, je suppose, est une séquence paresseuse.