#!/Usr/bin/python """ general stuff """ import re #@go def _rw(): f="sept10" for line in open(f): line = re.sub(r"^[ \t\n]*","",line) line = re.sub(r"[ \t\n]*$","",line) if line: print "[" + line + "]" def my2d(m,n) : out = [] for row in range(m): tmp =[] for col in range(n): tmp += [None] out += [tmp] return out def _2d(): x=my2d(5,5) x[2][3] = 4 print x #print 1 #_2d() #quit(); """ rules of printing - if things contain nested things - then print the nested things, indented according to the level of nesting - numbers get printed verbatim - string get surrounded by rabbit ears - list get printed one per line - dictionaries get printed ':key = value' - sorted on key order - if the value is simple, print it on the same line - simple = number or string - otherwise, find a dictionary containing all the instance's local variables, then print it as a dictionary (surrounded by the class name of the instance) """ from go import * import sys def say(x): sys.stdout.write(x) #-------------------------------------------------- # here are some structures which will become our # examples of "stuff to print" class Person(object): def __init__(i,name,age,shoesize,hobbies=[]): i.name = name i.age = age i.shoesize = shoesize i.hobbies = hobbies def bday(i): i.age += 1 class Emp(Person): def __init__(i,name,age,shoesize,hobbies,salary=0): super(Emp,i).__init__(name,age,shoesize,hobbies) i.salary = salary def promote(i): i.salary *= 1.1 class Point: def __init__(i,x=0,y=0): i.x=x i.y=y def rprint(i): return 'Point(%s @ %s)' % (i.x,i.y) x= [Emp("tim",10,10,["reading","writing"],1000), [ [3,"44"], 5, ["66", [7,8] ] ], Point(1,100) ] # ----------------------------------------------- # now lets print some stuff def rprint0(x,dpth=-1): "basic recursive print of lists" if isinstance(x, list): for y in x: rprint0(y,dpth+1) else: print ' ' * dpth + str(x) #@go def _rprint0() : rprint0(x) # ----------------------------------------------- def rprint1(x,dpth=-1): "as above, with rabbit ears around strings" def listp(x) : return isinstance(x,list) def stringp(x): return isinstance(x, str) def quoted(x) : return '\"%s\"' % x if stringp(x) else str(x) if listp(x): for y in x: rprint1(y,dpth+1) else: print ' ' * dpth + quoted(x) #@go def _rprint1() : rprint1(x) # ----------------------------------------------- def rprint2(x,dpth=-1): "as above, but allow instances to control their own printing" def listp(x) : return isinstance(x,list) def stringp(x): return isinstance(x, str) def quoted(x) : return '\"%s\"' % x if stringp(x) else str(x) def rprintable(x): return hasattr(x,"rprint") if listp(x): for y in x: rprint2(y,dpth+1) elif rprintable(x): print ' ' * dpth + ">>" + x.rprint() else: print ' ' * dpth + quoted(x) #@go def _rprint2() : rprint2(x) # ----------------------------------------------- def rprint(anything, dpth = 0): """ As above but if an instance has fields f1,f2,... then print those fields, but name. also, if a dictionary has keys k1,k2,.... then print those keys and values. Also, define some shortcuts to make the code clean. """ what = lambda x: ':%s' % x tabs = lambda n: ' ' * n # or 2 or 8 or... quoted = lambda x: '\"%s\"' % x if stringp(x) else str(x) equals = lambda x: ' = %s' % quoted(x) nump = lambda x: isinstance(x, (int, long, float, complex)) dictp = lambda x: isinstance(x, dict) listp = lambda x: isinstance(x, list) stringp = lambda x: isinstance(x, str) rprintable= lambda x: hasattr(x,"rprint") simple = lambda x: stringp(x) or nump(x) className = lambda x: x.__class__.__name__ if simple(anything): print tabs(dpth) + quoted(anything) elif rprintable(anything): print tabs(dpth) + anything.rprint() elif listp(anything): for something in anything: rprint(something, dpth+1) elif dictp(anything): for key in sorted(anything.keys()): value = anything[key] say(tabs(dpth) + what(key)) if simple(value): print equals(value) else: print "" rprint(value, dpth + 1) else: print tabs(dpth) + className(anything) + '(' rprint(anything.__dict__, dpth + 1) print tabs(dpth) + ')' @go def _rprint() : rprint({ 'key1' : list('abcdef'), 'key2' : 'value2', 'key3' : { 'key3a': 'value3a' }, 'key4' : { 'key4a': { 'key4aa': list('abcdef'), 'key4ab': Point(y=100), 'key4ac': Emp("tim",21,10, ["flying","swimming"], salary=10000)}, 'key4b': 100} })