git.fiddlerwoaroof.com
Raw Blame History
## pretty print dict
from emen2.subsystems import routing
for x in sorted(dct):
    print x.ljust(20), '=', dct[x]
##

days = ['Mon', 'Tues', 'Wed', 'Thur', 'Fri', 'Sat', 'Sun']
times = ['AM', 'PM', 'Night']
from random import random
def get_dict():
    result = {}
    for x in days:
        for y in times:
            result[(x,y)] = (random() < .5)
    return result


for x in range(20):
    a = db.newrecord('schedule', ctxid)
    a['schedule_times'] = get_dict()
    db.pclink(124, a.commit(), ctxid=ctxid)
    
##

def newfolder(name, parent):
    a = db.newrecord('folder', ctxid)
    a['folder_name'] = name
    db.pclink(parent, a.commit(), ctxid=ctxid)
##
print loads(db._Database__users.bdb[dumps('root')][:-1]+'''
S'email'
p17.''')

##
loads('''(iemen2.Database
User
p1
(dp2
S'username'
p3
S'root'
p4
sS'name'
p5
(S'Database'
S''
S'Administrator'
tp6
sS'creator'
p7
I0
sS'privacy'
p8
I0
sS'creationtime'
p9
S'2008/03/07 10:11:18'
p10
sS'disabled'
p11
I0
sS'record'
p12
NsS'groups'
p13
(lp14
I-1
asS'password'
p15
S'8843d7f92416211de9ebb963ff4ce28125932878'
p16
sS'email'
p17
Nsb.''')
##
class test(HTMLParser.HTMLParser):
    intable = False
    titling = False
    capturing = True
    cdata = []
    out = u''
    def handle_starttag(self, tag, attrs):
        print tag,attrs
        if dict(attrs).get('class', None) == 'm': self.capturing = False
        if tag.lower() == 'table': self.intable = True
        elif tag.lower() == 'title': self.titling = True
        elif tag.lower() == 'td' and dict(attrs).get('class', None) != 'm':
            self.capturing = True
    def handle_endtag(self, tag):
        if self.titling and tag.lower() == 'title': self.titling=False
        if self.capturing:
            out = u'\n'.join(self.cdata)
            self.cdata = []
            self.out += '\n' + out
            #print out
    def handle_data(self, data):
        if self.capturing and self.intable and data.strip() != '': self.cdata.append(data.decode('utf-8'))
        if self.titling: self.cdata.append(u'HEADING: %s' % data.decode('utf-8'))


b=test()
for x in range(1,14):
    with file('3_%02d.html' % x, 'rU') as a: (b.reset(),setattr(b, 'capturing', True), b.feed(a.read()))
a = file('2_01.html')
b.feed(a.read())
##
a = Database.User(dict(name=['Joe', '', 'Bloggs'], username='jblog', password='apassword', groups=[0]))
db.adduser(a)
db.approveuser(a.username,ctxid)
db.secrecordadduser ( ((a.username,),)*4, 125, ctxid=ctxid, recurse=3)
##
class Fwrapper:
  fileno = 3
  def write(self, data):
      os.write(self.fileno, data)
  def read(self, data):
      pass
##
def mdir(name=None):
    if name != None:
        lis = dir(name);
    else:
        lis = dir()
    lis.sort();
    lis = zip(lis[0::3],lis[1::3],lis[2::3])
    in_ = lambda x: [a.ljust(25) for a in x]
    out = lambda lis: ['\t'.join(in_(x)) for x in lis]
    print '\n'.join(out(lis))
##
from itertools import*;import sys;j=str.join;c=sys.stdin.read();print j('\n',map(lambda b:j(' ',[b,j('',islice(repeat('*'),len(filter(lambda x:x==b,c))))]),map(chr,range(97,122))))

from itertools import*;import sys;j=str.join;c=sys.stdin.read();print j('\n',[j(' ',[b,j('',islice(repeat('*'),len([x for x in c if x==b])))])for b in map(chr,range(97,122))])

from itertools import*;import sys;j=str.join;c=sys.stdin.read();print j('\n',[j(' ',[b,j('','*'*c.count(b))])for b in map(chr,range(65,123))])

module Main where import Data.Char;main=getContents>>=(\b->putStrLn$(map chr[65..122]>>=(\c->c:' ':(take(length$filter(\x->x==c)b)$repeat '*')++"\n")))
##
def mdir1(n):
    print '\n'.join((lambda l: ['\t'.join([a.ljust(25) for a in x]) for x in zip(l[0::3],l[1::3],l[2::3])])(sorted(dir(n) if n!=None else dir())))
##
import ipc;reload(ipc)
import test_ipc;reload(test_ipc)
from ipc import *;from test_ipc import *
buf=Buf();a=Transport(buf);b=Transport(buf)
[x for x in a.send('hello')]
##
from twisted.spread import pb
from twisted.internet import reactor
from twisted.python import util

factory = pb.PBClientFactory()
reactor.connectTCP("localhost", 8789, factory)
d = factory.getRootObject()
a = []
d.addCallback(lambda object: object.callRemote("nextQuote"))
d.addCallback(lambda echo: a.append(echo))
d.addErrback(lambda reason: 'error: '+str(reason.value))
d.addCallback(util.println)
reactor.run()
##
from twisted.internet import reactor
reactor.listenTCP(8789, factory)
reactor.run()
##
from twisted.spread import pb
class QuoteReader(pb.Root):
    def __init__(self, quoter):
        self.quoter = quoter
    def remote_nextQuote(self):
        return self.quoter.getQuote()


class Quoter(object):
    def getQuote(self): return 'Hello World!!\n'


factory = pb.PBServerFactory(QuoteReader(Quoter()))
##
from twisted.spread import pb
from twisted.internet import reactor

def main():
    foo = Foo()
    factory = pb.PBClientFactory()
    reactor.connectTCP("localhost", 8800, factory)
    factory.getRootObject().addCallback(foo.step1)
    reactor.run()


class Foo:
    def __init__(self):
        self.oneRef = None
    def step1(self, obj):
        print "got one object:", obj
        self.oneRef = obj
        print "asking it to getTwo"
        self.oneRef.callRemote("getTwo").addCallback(self.step2)
    def step2(self, two):
        print "got two object:", two
        print "giving it back to one"
        print "one is", self.oneRef
        self.oneRef.callRemote("checkTwo", two)


main()
##
from twisted.spread import pb, jelly
from twisted.python import log
from twisted.internet import reactor

class MyException(pb.Error): pass


class MyOtherException(pb.Error): pass


class ScaryObject:
    # not safe for serialization
    pass


def worksLike(obj):
    # the callback/errback sequence in class One works just like an
    # asynchronous version of the following:
    try:
        response = obj.callMethod(name, arg)
    except pb.DeadReferenceError:
        print " stale reference: the client disconnected or crashed"
    except jelly.InsecureJelly:
        print " InsecureJelly: you tried to send something unsafe to them"
    except (MyException, MyOtherException):
        print " remote raised a MyException" # or MyOtherException
    except:
        print " something else happened"
    else:
        print " method successful, response:", response


class One:
    def worked(self, response):
        print " method successful, response:", response
    def check_InsecureJelly(self, failure):
        failure.trap(jelly.InsecureJelly)
        print " InsecureJelly: you tried to send something unsafe to them"
        return None
    def check_MyException(self, failure):
        which = failure.trap(MyException, MyOtherException)
        if which == MyException:
            print " remote raised a MyException"
        else:
            print " remote raised a MyOtherException"
        return None
    def catch_everythingElse(self, failure):
        print " something else happened"
        log.err(failure)
        return None
    def doCall(self, explanation, arg):
        print explanation
        try:
            deferred = self.remote.callRemote("fooMethod", arg)
            deferred.addCallback(self.worked)
            deferred.addErrback(self.check_InsecureJelly)
            deferred.addErrback(self.check_MyException)
            deferred.addErrback(self.catch_everythingElse)
        except pb.DeadReferenceError:
            print " stale reference: the client disconnected or crashed"
    def callOne(self):
        self.doCall("callOne: call with safe object", "safe string")
    def callTwo(self):
        self.doCall("callTwo: call with dangerous object", ScaryObject())
    def callThree(self):
        self.doCall("callThree: call that raises remote exception", "panic!")
    def callShutdown(self):
        print "telling them to shut down"
        self.remote.callRemote("shutdown")
    def callFour(self):
        self.doCall("callFour: call on stale reference", "dummy")
    def got_obj(self, obj):
        self.remote = obj
        reactor.callLater(1, self.callOne)
        reactor.callLater(2, self.callTwo)
        reactor.callLater(3, self.callThree)
        reactor.callLater(4, self.callShutdown)
        reactor.callLater(5, self.callFour)
        reactor.callLater(6, reactor.stop)


factory = pb.PBClientFactory()
reactor.connectTCP("localhost", 8800, factory)
deferred = factory.getRootObject()
deferred.addCallback(One().got_obj)
reactor.run()
##
from twisted.spread import pb, jelly
from twisted.python import log
from twisted.internet import reactor

class LilyPond:
    def setStuff(self, color, numFrogs):
        self.color = color
        self.numFrogs = numFrogs
    def countFrogs(self):
        print "%d frogs" % self.numFrogs


class CopyPond(LilyPond, pb.Copyable):
    pass


class Sender:
    def __init__(self, pond):
        self.pond = pond
    def got_obj(self, remote):
        self.remote = remote
        d = remote.callRemote("takePond", self.pond)
        d.addCallback(self.ok).addErrback(self.notOk)
    def ok(self, response):
        print "pond arrived", response
        reactor.stop()
    def notOk(self, failure):
        print "error during takePond:"
        if failure.type == jelly.InsecureJelly:
            print " InsecureJelly"
        else:
            print failure
        reactor.stop()
        return None

def main():
    from copy_sender import CopyPond  # so it's not __main__.CopyPond
    pond = CopyPond()
    pond.setStuff("green", 7)
    pond.countFrogs()
    # class name:
    print ".".join([pond.__class__.__module__, pond.__class__.__name__])
    sender = Sender(pond)
    factory = pb.PBClientFactory()
    reactor.connectTCP("localhost", 8800, factory)
    deferred = factory.getRootObject()
    deferred.addCallback(sender.got_obj)
    reactor.run()

if __name__ == '__main__':
    main()
##
import SocketServer
from cPickle import loads, dumps

class EchoHandler(SocketServer.BaseRequestHandler):
  dct = dict(
      demoObject = (1,2,3,4,5),
      demoObject1 = set([1,2,3,4,5]),
      demoObject2 = dict(q=(1,2,3,4,5))
  )
  def handle(self):
    while 1:
      data = self.request.recv(1024)
      if not data: break
      result = {}
      for key in data.split():
          print key
          result[key] = self.dct.get(key, None)
      self.request.send(dumps(result))


EchoServer = SocketServer.TCPServer(("", 8881), EchoHandler)
EchoServer.serve_forever() 
##
wisted.spread import pb, jelly
from twisted.python import log
from twisted.internet import reactor

class LilyPond:
    def setStuff(self, color, numFrogs):
        self.color = color
        self.numFrogs = numFrogs
    def countFrogs(self):
        print "%d frogs" % self.numFrogs


class CopyPond(LilyPond, pb.Copyable): pass

class Sender:
    def __init__(self, pond):
        self.pond = pond
    def got_obj(self, remote):
        self.remote = remote
        d = remote.callRemote("takePond", self.pond)
        d.addCallback(self.ok).addErrback(self.notOk)
    def ok(self, response):
        print "pond arrived", response
        reactor.stop()
    def notOk(self, failure):
        print "error during takePond:"
        if failure.type == jelly.InsecureJelly:
            print " InsecureJelly"
        else:
            print failure
        reactor.stop()
        return None

def main():
    from copy_sender import CopyPond  # so it's not __main__.CopyPond
    pond = CopyPond()
    pond.setStuff("green", 7)
    pond.countFrogs()
    # class name:
    print ".".join([pond.__class__.__module__, pond.__class__.__name__])
    sender = Sender(pond)
    factory = pb.PBClientFactory()
    reactor.connectTCP("localhost", 8800, factory)
    deferred = factory.getRootObject()
    deferred.addCallback(sender.got_obj)
    reactor.run()

if __name__ == '__main__':
    main()
####

def cmp_dicts(dct, dct1):
    cp = set()
    for k in dct.keys():
        if dct[k] != dct1.get(k,None):
            cp.add(k)
    return cp		

####
thelist = [1,2,3,4,5,6,7,8,9,8,7,7,6,5,3,2,1,0]
thelist.insert(0, len(thelist))
datasize = thelist[0]
i=j=1;
while j <= (datasize-1):
	if thelist[j] == thelist[j+1]:
            j+=1
            continue
	if i==j:
            i+=1
            j+=1
            continue
	thelist[i]=thelist[j]
	i+=1
        j+=1
                
####
genetics.py -- python/ga
python -i genetics.py
####
GOAL = 17
POP = 30
a = [encode(sensify_list(decode(get_n_genes()))) for x in range(POP)]
from functools import partial
cp = partial(compare_seqs, goal=GOAL)
a.sort(cp)
b = [evaluate(decode(x)) for x in a]
b
sorted(b)

a = [encode(sensify_list(decode(cross(*a[:2])))) for _ in range(POP)]
####
import datetime
import emen2.subsystems.serializable_class
reload(emen2.subsystems.serializable_class)
from emen2.subsystems.serializable_class import *
a = schedule()
a.add_param('microscope', 129)
a.add_param('startdate', datetime.datetime(2008,1,1))
a.add_param('microscope', db.getrecord(129,ctxid))
####
a = db.newrecord('folder')
a.commit()
a.commit()
a['folder_name'] = 'aasd'
a.commit()
####
a = db.getrecord(range(200,300))
[x['indexby'] for x in a]
for x in a: x['indexby'] = 'theteststring'

[x['indexby'] for x in a]
db.putrecord(a)
a = db.getrecord(range(200,300))
[x['indexby'] for x in a]
###
range(463,962)
###
db._DBProxy__ctxid = 'b85246688f24c14712e0a7dfb93413f5defd50c4'
db.getrecord(0)
db.checkcontext()
dbtree.get_children()
dbtree.get_children([1])
###
a = {
    0: set([1, 14, 16, 17, 19, 20, 21, 22]), 
    1: set([2]), 
    2: set([]), 
    14: set([15]), 
    15: set([]), 
    16: set([18]), 
    17: set([]), 
    18: set([]), 
    19: set([]), 
    20: set([]), 
    21: set([]), 
    22: set([])
}
def lookup(lis, table):
    cset = table[lis.pop(0)]
    ckey = None
    for x in lis[:-1]:
        if x in cset: 
            ckey = x
            cset = table[x]
            print x, cset
        else:
            raise Exception()
    if lis[-1] in cset:
        key = lis[-1]
        return key, table[key]
    else:
        raise Exception()

import UserDict
import operator
class Tree(object, UserDict.DictMixin):
    def __init__(self, table, root):
        self.key = root
        self.filled = False
        self.children = {}
        if root in table:
            result = []
            for child in table[root]:
                result.append((child, Tree(table, child)))
            self.filled = True
            self.children.update(result)
        
    def __getitem__(self, key):
        if hasattr(key, '__iter__'): 
            return self.find([self.key] + list(key))
        return self.children[key]
    def keys(self): 
        return self.children.keys()
    def find(self, path):
        if len(path) == 1:
            return self
        else:
            value = self[path[1]]
            if value is not None:
                value = value.find(path[1:])
                return value
    def __str__(self): 
        return '\n'.join(self.mkstrtree(0))
    def mkstrtree(self, level, space='--'):
        result = [space*level+str(level+1)+space+str(self.key)]
        for id, child in self.children.items():
            result.extend(child.mkstrtree(level+1)) 
        return result
    def mktree(self):
        result = {}
        def setitem(dict, key, value): dict[key] = value
        for key, value in self.children.items():
            if value.filled:
                setitem(result, key, value.mktree()) 
            else:
                setitem(result, key, None) 
        return result
    def count(self):
        return len(self) + reduce(operator.add, 
                                  [x.count() for x in self.children.values()], 
                                  0)
                                 

b = Tree(a, 135);print b
###
{
    0: {
        1:{
            2: {}
        }, 
        14: {
            15: {}
        },
        16:{
            18: {}
        },
        17:{}
        19:{}
        20:{}
        21:{}
        22:{}
    }
}

###
{0: set([1, 2, 3]), 1: set([2, 3, 4]), 2: set([3, 4, 5]), 3: set([4, 5, 6]), 4: set([5, 6, 7]), 5: set([8, 6, 7]), 6: set([8, 9, 7]), 7: set([8, 9]), 8: set([9]), 9: set([])}
###
import re
re.sub('&([^;]+);', r'&.\1.;', 'sdsfjsdlflsdfsdf&asdasd;dfsdfgsfdgfsd&dsfdsaf; &sfgfdgds;')
import htmlentitydefs
result = []
for x in a:
    n = htmlentitydefs.codepoint2name.get(ord(x))
    if n is not None: x = '&%s;' % n
    result.append(x)
####
[htmlentitydefs.name2codepoint.get(y,y) for y in [x[1] or x[2] for x in re.findall('(&([^;]+);|([^&]))', a)]]
result = []
for x in _:
    if isinstance(x, int): result.append(chr(x))
    else: result.append(x)


''.join(result)
htmlentitydefs.codepoint2name[ord('&')]
###
class LazyLoad(object):
    def __init__(self, __func_, *args, **kwargs):
        self.__func = __func_
        self.__args = list(args)
        self.__kwargs = kwargs
    def __get__(self, inst, cls):
        tb = cls.__dict__
        nm = [x for x in tb.keys() if id(tb[x]) == id(self)][0] 
        setattr(inst, nm, self.__func(*self.__args, **self.__kwargs))
        return getattr(inst, nm)

def func(a,b,c):
    print a,b,c
    return a+b,c

class a(object):
    b = LazyLoad(func, 1,2,3)
    c = LazyLoad(func, 2,3,4)
    d = LazyLoad(func, 3,4,5)
    __e = LazyLoad(func, 4,5,6)
    def __str__(self): return str(self.__e)
####
import HTMLParser
class TMP(HTMLParser.HTMLParser):
	INI = 0
	DIV = 1
	OTH = 2
	AST = 3
	def __init__(self):
		HTMLParser.HTMLParser.__init__(self)
		self.links = [];self.__tmp = [];self.dbuf = '';self.__state = self.INI;self.level = 0
	def handle_starttag(self, tag, attrs):
		attrs = dict(attrs);self.level += 1
		print '%stag: %r, attrs: %r, state: %r' % ('\t'*self.level, tag, attrs, self.__state),
		if tag == 'div' and self.__state != self.DIV and attrs.get('class') == 'smallbox':
			print 'useful div',
			self.__state = self.DIV
		elif tag == 'img' and self.__state == self.OTH:
			print 'useful image',
			self.__tmp.append(attrs['src'])
		elif tag == 'a' and self.__state == self.DIV:
			print 'useful link',
			self.__tmp.append(attrs['href']);self.__state = self.OTH
		print '..done'
	def handle_endtag(self, tag):
		print '%sclose tag: %r' % ('\t'*self.level, tag)
		self.level -= 1
		if tag == 'div' and self.__state == self.DIV:
			if self.dbuf is not '':
				self.__tmp.append(self.dbuf)
				self.dbuf = ''
			self.links.append(self.__tmp);self.__tmp = []
			self.__state == self.INI
		elif tag == 'a' and self.__state == self.OTH:
			self.__state = self.DIV
			if self.dbuf is not '':
				self.__tmp.append(self.dbuf)
				self.dbuf = ''
	def handle_data(self, data):
		if self.__state == self.OTH:
			self.dbuf += data + ' '

####
import HTMLParser
class TMP(HTMLParser.HTMLParser):
	INI = 0
	DIV = 1
	OTH = 2
	def __init__(self):
		HTMLParser.HTMLParser.__init__(self)
		self.level = 0
	def handle_starttag(self, tag, attrs):
		attrs = dict(attrs);self.level += 1
		print '%s%r: %r' % ('\t'*self.level, tag, attrs)
	def handle_endtag(self, tag):
		print '%sclose tag: %r' % ('\t'*self.level, tag)
		self.level -= 1
	def handle_data(self, data):
		print '%sdata: %r' %('\t'*(self.level+1), data)


import mechanize
def show_site(url):
	br = mechanize.Browser()
	r = br.open(url)
	print r.info()
	_a = TMP()
	_a.feed(r.read())
	#return _a.links


a = filter(None, show_site(raw_input('url? ')))
####
def inst(func):
	return func()


class IterDict(dict):
  keylist = []
  @staticmethod
  def keylistiter_():
    print IterDict.keylist
    index = 0
    while 1:
      if index >= len(IterDict.keylist): index = 0
      if not IterDict.keylist: break
      yield IterDict.keylist[index]
      index += 1
  keylistiter = keylistiter_.__get__(1)()
  @classmethod
  def reset(cls): cls.keylistiter = cls.keylistiter_()
  def __setitem__(self, name, value):
    if name not in self.keylist:
        self.keylist.append(name)
    dict.__setitem__(self, name, value)
  def __delitem__(self, name):
    if name in self.keylist:
      del self.keylist[self.keylist.index(name)]
	dict.__delitem__(self, name)


import itertools


class CONT(object): pass
    

class PIDmanager(object):
	queue = IterDict()
	tasks = None
	@inst
	def pid_generator():
		counter = 0
		while 1:
			yield counter
			counter += 1
	@classmethod
	def put_task(self, task):
		pid = self.pid_generator.next()
		self.queue[pid] = task
        print pid
		if self.tasks == None:
            self.queue.reset()
			self.tasks = self.queue.keylistiter
            self.tasks.next()
	@classmethod
	def run_task(self):
		if self.tasks != None:
			pid = self.tasks.next()
			task = self.queue[pid]
			if hasattr(task, '__iter__') and isinstance(task[0], CONT):
				_, func, args, kwargs, cleanup = task
                result = []
				self.queue[pid] = func(*args, **kwargs)
				cleanup()
                return self.queue[pid]
			else:
				del self.queue[pid]
                return task
    @classmethod
    def run_all(self):
        try:
            while 1: self.run_task()
        except StopIteration:
            self.queue.reset()
            self.tasks == None


def print_many(gen, total=2000, count=0):
	print gen.next(),
	if count < total:
		return CONT(), print_many, (gen,), dict(total=total, count=count+1), cleanup


def cleanup(): print


PIDmanager.put_task( (CONT(), print_many, (itertools.cycle('a'),), dict(total=10), cleanup) )
PIDmanager.put_task( (CONT(), print_many, (itertools.cycle('b'),), dict(total=10), cleanup) )
PIDmanager.run_task()
######
import functools

class Namespace(object):
    def __init__(self):
        self.__insts = {}
    def _bind_class(self, name, bases, dict):
        cls = type(name, bases, dict)
        cls.__ns = self
        def __init__(slf, *args, **kwargs):
            self.__insts[id(slf)] = slf
            cls.__init__(*args, **kwargs)
        print cls.__init__
        cls.__init__ = __init__
        return cls
    def __call__(self, func):
        result = func
        if not func.__name__.startswith('_'):
            setattr(self, func.__name__, func)
            result = None
        return result
    def __getattribute__(self, name):
        result = object.__getattribute__(self, name)
        if callable(result):
            result=functools.partial(result, self.__inst)
        return result
                

                

class NamespacedClass(object):
    a = Namespace()
    __metaclass__ = a._bind_class
    @a
    def b(self, test_arg):
        print self, test_arg
    
######
a = db.newrecord('folder')
a.commit()
if type(_) != int: print '!!!!!!!!!!!!!!!!!!!!'
a.commit()
if _ is not 'No changes made': print '!!!!!!!!!!!!!!!!!!!!'
a['folder_name'] = 'aasd'
a.commit()

######
import abc
class Pipe(object):
    __metaclass__ = abc.ABCMeta
    @property
    def file(self): return self.__file
    def __init__(self, file, *args, **kw):
        self.__file = file
        self.__delim = '\n'
        self.init(*args, **kw)
    def init(self, *args, **kw): pass
    #
    def __getattribute__(self, name):
        result = None
        try:
            result = object.__getattribute__(self, name)
        except Exception, e:
            try:
                result = self.__file.__getattribute__(name)
            except:
                raise e
        return result
    #
    def read(self, bytes=-1):
        buf = self.process_chunk(self.__file.read(bytes))
        return buf        
    #
    @abc.abstractmethod
    def process_chunk(self, chunk): return chunk



import re
class Grep(Pipe):
    def init(self, regex, delim='\n', *_, **__):
        self.__re = re.compile(regex)
        self.__delim = delim
    #
    def process_chunk(self, chunk):
        buf = chunk.split(self.__delim)
        out = []
        while buf:
            line = buf.pop(0)
            if self.__re.search(line):
                out.append(line)
        return self.__delim.join(out)
######
import functools
import collections
def instantiate(cls): return cls()

class Namespace(object):
    def registry(name, bases, dict_):
        cls = type(name, bases, dict_)
        cls.__dict = {}
        return cls
    __metaclass__ = registry
    def __init__(self, instance=None):
        self.__dict__ = self.__dict
        self.__inst = instance
        self._init()
    def _init(self): pass
    def __get__(self, instance, owner):
        result = type(self)(instance)
        return result
    def __check_inst(self):
        if self.__inst is None: 
            raise AttributeError, 'this class is unbound, can\'t call methods'
    def __getattribute__(self, name):
        if not name.startswith('_'): 
            self.__check_inst()
        result = object.__getattribute__(self, name)
        if callable(result) and not name.startswith('_'): 
            result = functools.partial(result, self.__inst)
        return result
        


class DB(object):
    @instantiate
    class record(Namespace):
        @classmethod
        def _init(self):
            self.__value = 1
        def get(self, db):
            return self.__value
        def set(self, db, value):
            self.__value = value
        def checkparam(self, db):
            print db.param.get()
            return db.param.get() == self.get()
    @instantiate
    class param(Namespace):
        @classmethod
        def _init(self):
            self.__value = 1
        def get(self, db):
            db.othermethod(self.__value)
            return self.__value
        def set(self, db, value):
            db.othermethod(self.__value)
            self.__value = value
            db.othermethod(self.__value)
    def othermethod(self, value): print self, value
    def recordget(self): return self.record.get()
    def recordset(self, value): return self.record.set(value)
####
import functools

def memoize(func):
    _cache = {}
    class NULL:pass
    NULL = NULL()
    @functools.wraps(func)
    def _inner(*args, **kwargs):
        _kwargs = tuple(
            (k, tuple(v) if hasattr(v, '__iter__') else v) for k,v in kwargs
        )
        value = _cache.get((args, _kwargs), NULL)
        if value is NULL:
            value = func(*args, **kwargs)
            _cache[(args,_kwargs)] = value
        return value
    _inner.__enter__ = lambda *_: _inner
    _inner.__exit__ = lambda *_: _cache.clear()
    _inner.reset = _cache.clear
    _inner.cache = _cache
    _inner.orig = func
    return _inner

class return_if(object):
    def __init__(self, map):
        self._map = dict(
            (tuple(k) if hasattr(k, '__iter__') else (k,),v) for k,v in map.iteritems()
        )
        self._func = lambda x:x
    def _inner(self, *args):
        if args in self._map: return self._map[args]
        else: return self._func(*args)
    def __call__(self, func):
        self._func = func
        return self._inner


@memoize
@return_if({1: 1})
def fact(n):
    return n*fact(n-1)


@return_if({(1,1): 2, (2,2): 3, (3,3):4})
def sum(a,b):
    return a+b


@memoize
@return_if({1: 1,2: 1})
def fib(n):
    if n < 1: raise ValueError, "not n >= 1"
    else:
        return fib(n-1) + fib(n-2)
####

def b(): return a(2)

def c(): return b()*3

def a(n):
     if n==1:
       return n
     else:
       return n*n-1


def d(a):
     return 
     

def e(a):
 return 

####

def f(h):
  def g(n):
     if n <= 1: return 1
     else: return n*h(n-1)

#def e(h):
#  def

def Y(f): 
  def g(h):  
    def i(x):
      return f(h(h))(x)
    return i
  return g(g)


@Y
def fib(f):
    def _inner(n):
        if n in range(2): return 1
        else: return f(n-1) + f(n-2)
    return _inner


import functools

def bounce(func):
  @functools.wraps(func)
  def _inner(arg):
    result = func(arg)
    return result(fact)
  return _inner

class return_if(object):
    def __init__(self, map):
        self._map = dict(
            (tuple(k) if hasattr(k, '__iter__') else (k,),v) for k,v in map.iteritems()
        )
        self._func = lambda x:x
    def _inner(self, *args):
        if args in self._map: return self._map[args]
        else: return self._func(*args)
    def __call__(self, func):
        self._func = func
        return self._inner
@bounce
@return_if({1: lambda _:1})
def fact(n):
    return lambda x: n*x(n-1)

####
class Result(object):
    def __repr__(self): return 'Result: %r' % self.v
    def __init__(self, v): self.v = v

def wrapper(func):
    def _inner(a):
        results = []
        results.append(func(a))
        v = results[-1].next()
        print v
        while not isinstance(v, Result):
            results.append(func(v))
            v = results[-1].next()
            print v
        results.pop()
        if not results: result = v
        else:
            result = results.pop().send(v.v)
            while results:
                result = results.pop().send(result.v)
        return result.v        
    return _inner

####
gen = fib(2)
gen.next()
gen1 = fib(_)
gen1.next()
gen.send(_.v)
gen2 = fib(_)
gen2.next()
gen.send(_.v)
_.v
####
def wrapper(func):
    def _inner(a):
        results = []
        results.append(func(a))
        v = results[0].next()
        idx = 0
        while True:
            if not isinstance(v, Result):
                results.append(func(v))
                idx = len(results) - 1
                v = results[idx].next()
            else:
                del results[idx]
                if len(results) == 0: break
                else:
                    idx -= 1
                    v = results[idx].send(v.v)
        return v.v
    return _inner

@wrapper
def fact(a):
    if a == 1:
        yield Result(1)
    yield Result(a * (yield a-1))

@wrapper
def count(a):
    if a == []: yield Result(0)
    else:
        yield Result(1 + (yield a[1:]))

@wrapper
def fib(a):
    if a in [1,2]: yield Result(1)
    else:
        z = (yield a-1)
        b = (yield a-2)
        yield Result( z + b )

@wrapper
def fib(a):
    if a in [1,2]: yield Result(1)
    else:
        z = (yield a-1)
        b = (yield a-2)
        yield Result( z + b )


@wrapper
def reverse(lis):
    if lis == []: yield Result([])
    else:
        yield Result( [(yield lis[1:]), lis[0]] )
##

def get_macaddr():
    'Get Mac address in Python > 2.5'
    import uuid
    return ':'.join(
        [
            a[x:x+2] for a in [ '%012x'%uuid.getnode() ]
            for x in range(0,len(a),2)
        ]
    )