Класс для работы со списками
Небольшой класс, который я использую для работы со списками в интерактивном режиме. Вообще для этого хорош 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))






Comments