Advertisement
Guest User

Untitled

a guest
Jun 9th, 2017
137
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.44 KB | None | 0 0
  1. import inspect
  2. import itertools
  3.  
  4. def chained(func):
  5.     def meth(self, *args, **kwargs):
  6.         result = func(self, *args, **kwargs)
  7.         return self if result is None else result
  8.  
  9.     return meth
  10.  
  11.  
  12. class pynq:
  13.     def __init__(self, seq):
  14.         self._seq = seq
  15.  
  16.     @staticmethod
  17.     def _extractor_func(extractor, kwargs, _ident=lambda x: x):
  18.         '''Return a tuple containing an extractor function and True
  19.        if the function takes more than 1 parameter, else False. This
  20.        second value indicates whether enumeration should take place.'''
  21.  
  22.         if extractor:
  23.             if len(extractor) > 1:
  24.                 raise TypeError('Too many positional args. '
  25.                                 'Only 1 allowed.')
  26.             extract = extractor[0]
  27.         elif not kwargs:
  28.             extract=_ident
  29.         elif len(kwargs) != 1:
  30.             raise TypeError('Too many named parameters. Only 1 allowed.')
  31.         else:
  32.             for var, code in kwargs.items():
  33.                 extract=eval('lambda {}: {}'.format(var, code))
  34.                 break
  35.  
  36.         sig = inspect.signature(extract)
  37.         return extract, (len(sig.parameters) > 1)
  38.  
  39.     @staticmethod
  40.     def _select_many(seq, extract):
  41.         '''Deferred execution of select_many'''
  42.         for item in seq:
  43.             for elt in extract(item):
  44.                 yield elt
  45.  
  46.     @chained
  47.     def select_many(self, *extractor, **kwargs):
  48.         '''Flatten a sequence of sequences into a single stream.'''
  49.         extract = pynq._extractor_func(extractor, kwargs)
  50.         self._seq = pynq._select_many(self._seq, extract)
  51.  
  52.     @staticmethod
  53.     def _sorted(seq, keyfunc):
  54.         for item in sorted(seq, key=keyfunc):
  55.             yield item
  56.  
  57.     @staticmethod
  58.     def _group_by(seq, extract):
  59.         '''Deferred execution of group_by'''
  60.         for _, group in itertools.groupby(seq, key=extract):
  61.             yield group
  62.  
  63.     @chained
  64.     def group_by(self, *extractor, **kwargs):
  65.         '''Sort the sequence, and group together items by the extractor
  66.        function.
  67.  
  68.        >>> import pynq
  69.        >>> z='z'
  70.        >>> a='a'
  71.        >>> L = [(0,z), (1,a), (2,z), (3,a), (4,z), (5,z)]
  72.        >>> it = iter(pynq(L).group_by( k = 'k[1]' ))
  73.        >>> len(next(it))
  74.        2
  75.        >>> len(next(it))
  76.        4
  77.        '''
  78.         extract = pynq._extractor_func(extractor, kwargs)
  79.         self._seq = pynq._sorted(self._seq, extract)
  80.         self._seq = pynq._group_by(self._seq, extract)
  81.         return self
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement