blade documentation

blade.xfilter

«  blade.xcmp   ::   Contents   ::   blade.xmap  »

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:
  • iterableiterable
  • names (str) – attribute names
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:

iterator of True or, alternatively, False items

>>> 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:iterableiterable
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)

«  blade.xcmp   ::   Contents   ::   blade.xmap  »