blade.xfilter¶
blade filtering operations
- blade.xfilter.xattrs(iterable, *names)¶
Collect attribute values from items in iterable that match an attribute name in names.
Parameters: Returns: iterator of values
>>> from blade.xfilter import xattrs >>> from stuf import stuf >>> stooge = [ ... stuf(name='moe', age=40), ... stuf(name='larry', age=50), ... stuf(name='curly', age=60), ... ] >>> list(xattrs(stooge, 'name')) ['moe', 'larry', 'curly'] >>> # multiple attribute names >>> list(xattrs(stooge, 'name', 'age')) [('moe', 40), ('larry', 50), ('curly', 60)] >>> # no attrs named 'place' >>> list(xattrs(stooge, 'place')) []
- blade.xfilter.xfilter(iterable, test, invert=False)¶
Collect items in iterable matched by test.
Parameters: Returns: >>> from blade.xfilter import xfilter >>> # filter for true values >>> list(xfilter([1, 2, 3, 4, 5, 6], lambda x: x % 2 == 0)) [2, 4, 6] >>> # filter for false values >>> list(xfilter([1, 2, 3, 4, 5, 6], lambda x: x % 2 == 0, invert=True)) [1, 3, 5]
- blade.xfilter.xgroup(iterable, test=None)¶
Group items in iterable using test as the key function.
Parameters: Returns: iterator of namedtuples of Group(keys=keys, groups=tuple)
>>> from blade.xfilter import xgroup >>> # default grouping >>> list(xgroup([1.3, 2.1])) [Group(keys=1.3, groups=(1.3,)), Group(keys=2.1, groups=(2.1,))] >>> from math import floor >>> # use test for key function >>> list(xgroup([1.3, 2.1, 2.4], floor)) [Group(keys=1.0, groups=(1.3,)), Group(keys=2.0, groups=(2.1, 2.4))]
- blade.xfilter.xitems(iterable, *keys)¶
Collect values from items in iterable (usually a sequence or mapping) that match a key found in keys.
Parameters: Returns: iterator of items
>>> from blade.xfilter import xitems >>> stooge = [ ... dict(name='moe', age=40), ... dict(name='larry', age=50), ... dict(name='curly', age=60), ... ] >>> # get items from mappings like dictionaries, etc... >>> list(xitems(stooge, 'name')) ['moe', 'larry', 'curly'] >>> list(xitems(stooge, 'name', 'age')) [('moe', 40), ('larry', 50), ('curly', 60)] >>> # get items from sequences like lists, tuples, etc... >>> stooge = [['moe', 40], ['larry', 50], ['curly', 60]] >>> list(xitems(stooge, 0)) ['moe', 'larry', 'curly'] >>> list(xitems(stooge, 1)) [40, 50, 60] >>> list(xitems(stooge, 'place')) []
- blade.xfilter.xmembers(iterable, test, inverse=False)¶
Collect values shallowly from classes or objects in classes in iterable matched by test.
Parameters: Returns: iterator of values
>>> from blade.xfilter import xmembers >>> class stooges: ... name = 'moe' ... age = 40 >>> class stoog2: ... name = 'larry' ... age = 50 >>> class stoog3: ... name = 'curly' ... age = 60 ... class stoog4: ... name = 'beastly' ... age = 969 >>> list(xmembers([stoog3], lambda x: not x[0].startswith('__'))) [('age', 60), ('name', 'curly'), ('stoog4', stoog3.stoog4)]
- blade.xfilter.xmro(iterable)¶
Extract classes in the method resolution order of classes or objects in classes in iterable.
Parameters: iterable – iterable Returns: iterator of classes >>> from blade.xfilter import xmro >>> class stooges: ... name = 'moe' ... age = 40 >>> class stoog2(stooges): ... name = 'larry' ... age = 50 >>> class stoog3(stoog2): ... name = 'curly' ... age = 60 ... class stoog4: ... name = 'beastly' ... age = 969 >>> results = list(xmro([stoog3])) >>> stooges in results True >>> stoog3 in results True >>> stoog2 in results True
- blade.xfilter.xtraverse(iterable, test, invert=False)¶
Collect values from deeply nested scopes from items in iterable matched by test.
Parameters: Returns: iterator of ChainMaps containing OrderedDict
>>> from blade.xfilter import xtraverse >>> class stooge: ... name = 'moe' ... age = 40 >>> class stooge2: ... name = 'larry' ... age = 50 >>> class stooge3: ... name = 'curly' ... age = 60 ... class stooge4(object): ... name = 'beastly' ... age = 969 >>> def test(x): ... if x[0] == 'name': ... return True ... elif x[0].startswith('__'): ... return True ... return False >>> # using test while filtering for False values >>> list(xtraverse([stooge, stooge2, stooge3], test, invert=True)) [ChainMap(OrderedDict([('classname', 'stooge'), ('age', 40)])), ChainMap(OrderedDict([('classname', 'stooge2'), ('age', 50)])), ChainMap(OrderedDict([('classname', 'stooge3'), ('age', 60)]), OrderedDict([('age', 969), ('classname', 'stooge4')]))]
- blade.xfilter.xtruefalse(iterable, test)¶
Divide items in iterable into two iterables, the first everything test is True for and the second everything test is False for.
Parameters: Returns: namedtuple of two iterators, one of items for which test is True and one for which test is False.
>>> from blade.xfilter import xtruefalse >>> divide = xtruefalse([1, 2, 3, 4, 5, 6], lambda x: x % 2 == 0) >>> tuple(divide.true) (2, 4, 6) >>> tuple(divide.false) (1, 3, 5)