在Python中如何构建懒序列?
有一个Django视图,它从数据库中加载Member
对象,并且使用了一些特定的过滤条件。
现在我需要改变这个逻辑,让一个特定的Member
排在最前面,然后其他的按自然顺序排列。
最简单的方法就是立即执行查询,得到一个列表,然后把那个特定的成员移到最前面。不过我更想知道有没有办法继续利用QuerySet
的懒加载特性。
在C#中,我会这样写:
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)
);
当循环遍历members
时,它会先获取specificMember
,然后再使用原本db.Members
的懒加载逻辑。
在Django和Python中,有没有办法做到同样的事情呢?
1 个回答
6
使用 itertools.chain
。可以这样做:
import itertools
original_members = .... # get an iterator of the data
members = itertools.chain([specific_member], original_members)
这个链式函数会返回一个迭代器。这个迭代器首先会返回第一个参数中的值,也就是一个只包含特定成员的单元素列表。接着,它会开始返回 original_members
中的值,我猜这个是一个延迟加载的序列。