<p>您提到的每种选择过程都可以用<code>itertools</code>迭代器来定义。下面的内容形式化了这一点,并且可以很容易地扩展到支持更多种类。使用它的语法似乎非常易读。在</p>
<p>虽然我没有做任何性能测试,但我希望结果是有竞争力的,因为几乎所有的开销都在构造函数方法中。唯一可能要快一点的方法是用等价的<code>itertools</code>迭代器函数替换它的用法,因此如果您希望进行大量此类处理,那么它可能是一个有效的方便工具。在</p>
<pre><code>import itertools
class Selector(object):
def __init__(self, iterable, **kwargs):
if not kwargs:
self.iterator = iterable
elif len(kwargs) > 1:
raise ValueError('only one selector type keyword allowed')
else:
selector, target = kwargs.items()[0]
if selector == 'by_attr':
self.iterator = itertools.imap(lambda obj: getattr(obj, target), iterable)
elif selector == 'by_type':
self.iterator = itertools.ifilter(lambda obj: isinstance(obj, target),
iterable)
elif selector == 'by_func':
self.iterator = itertools.ifilter(target, iterable)
else:
raise ValueError('unknown selector type keyword')
def __iter__(self):
return self.iterator
if __name__ == '__main__':
from selector import Selector
class A(object):
def __init__(self, a, b):
self.a, self.b = a, b
class Flower(object):
def __init__(self, name):
self.name = name
sel = [A(3, 4), A(0, 9), A('test', 3), A(4,22), A(3, 9)]
print list(Selector(sel, by_attr='a'))
sel = [42, Flower('Buttercup'), [1,2,3,5,8], A(20, 13), Flower('Rose')]
print list(Selector(sel, by_type=Flower))
sel = [4, 9, 3, 22, 9]
print list(Selector(sel, by_func=lambda i: i%2 == 0))
</code></pre>