Класс для работы со списками

Небольшой класс, который я использую для работы со списками в интерактивном режиме. Вообще для этого хорош ipipe.

Пара примеров использования


$ x=ls(os.listdir('.'))
$ x
Out:  ['build', 'screenlets', 'bin', 'MANIFEST.in', 'sq.pyc', 'goocanvas.py', 'sq.py', 'setup.py', '.hg', 'dist', 'hackwrench.egg-info', 'hackwrench', 'pyide.py', 'fap.js', 'test_jswebkit.py']
$ x.filter(os.path.isfile).sorted(os.path.getctime)
Out: 
['test_jswebkit.py', 'fap.js', 'MANIFEST.in', 'setup.py', 'pyide.py', 'goocanvas.py', 'sq.py', 'sq.pyc']
$ x.filter(os.path.isfile).sorted(os.path.getctime).map(os.path.splitext)
Out: 
[('test_jswebkit', '.py'), ('fap', '.js'), ('MANIFEST', '.in'), ('setup', '.py'), ('pyide', '.py'), ('goocanvas', '.py'), ('sq', '.py'), ('sq', '.pyc')]
$ x.filter(os.path.isfile).sorted(os.path.getctime).map(os.path.splitext).map[1]
Out: ['.py', '.js', '.in', '.py', '.py', '.py', '.py', '.pyc']
$ x.filter(os.path.isfile).sorted(os.path.getctime).map(os.path.splitext).map[1].map('_.lstrip(".")')
Out: ['py', 'js', 'in', 'py', 'py', 'py', 'py', 'pyc']

$ screen = wnck.screen_get_default()
$ x=ls(screen.get_windows())
$ x.zmap.get_name()
Out: 
[(,  'xfce4-panel 4.6.1'), (, 'Desktop'), (,
  'ph@ph-laptop: ~/work'), (,  'Programming Languages — Google Code University — Google Code — Chromium'), (,
  'ph@ph-laptop: ~/work'), (, 'Liferea'), (,  'ph@ph-laptop: ~'),
 (,  'q.py (~/work) — GVIM'),]
$ x.zmap.get_name().grep('Liferea')[0]
Out: (, 'Liferea')
$ x.zmap.get_name().grep('Liferea')[0][0].minimize()
$ # окошко свернулось

from itertools import imap

class _map(object):
    def __init__(self, parent):
        self.parent = parent
    def __call__(self, func):
        if isinstance(func, basestring):
            return self.parent.__class__(eval(func) for _ in self.parent)
        else:
            return self.parent.__class__(func(_) for _ in self.parent)
    def __getattr__(self, k):
        def wrap(*args, **kargs):
            return self.parent.__class__(getattr(x,k)(*args,**kargs) for x in self.parent)
        return wrap
    def __getitem__(self, k):
        if isinstance(k, basestring):
            return self.parent.__class__(hasattr(x,k) and getattr(x,k) or getitem(x,k) for x in self.parent)
        else:
            return self.parent.__class__(getitem(x,k) for x in self.parent)

class _zmap(object):
    def __init__(self, parent, cls=None):
        self.parent = parent
        if cls is None:
            cls = parent.__class__
        self.cls = cls
    def __call__(self, func):
        if isinstance(func, basestring):
            return self.cls(izip(self.parent, (eval(func) for _ in self.parent)))
        else:
            return self.cls(izip(self.parent, (func(_) for _ in self.parent)))
    def __getattr__(self, k):
        def wrap(*args, **kargs):
            return self.cls(izip(self.parent, (getattr(x,k)(*args,**kargs) for x in self.parent)))
        return wrap
    def __getitem__(self, k):
        if isinstance(k, basestring):
            return self.cls(izip(self.parent, (hasattr(x,k) and getattr(x,k) or getitem(x,k) for x in self.parent)))
        else:
            return self.cls(izip(self.parent, (getitem(x,k) for x in self.parent)))

class ls(list):
    def __init__(self, *args):
        list.__init__(self, *args)
        self.map = _map(self)
        self.zmap = _zmap(self)
        self.dict = _zmap(self, dict)
    def __getslice__(self, *args):
        return self.__class__(super(ls, self).__getslice__(*args))
    def sorted(self,key=None,reverse=False,cmp=None,func=None):
        if func: cmp=lambda a,b:cmp(func(a),func(b))
        return self.__class__(sorted(self, cmp, key, reverse))
    def reversed(self):
        return self.__class__(self[::-1])
    def filter(self, func):
        if isinstance(func, basestring):
            return self.__class__(filter(lambda _:eval(func), self))
        return self.__class__(filter(func, self))
    def grep(self,key,negate=False):
        if negate:
            return self.__class__(x for x in self if key not in repr(x))
        else:
            return self.__class__(x for x in self if key in repr(x))
Add post to:   Delicious Reddit Slashdot Digg Technorati Google
Make comment

Comments

No comments for this post

Required. 30 chars of fewer.

Required.

captcha image Please, enter symbols, which you see on the image