def rprint(x):
  pad="|--"
  rprint1(x,pad,"",0,1,{})

def rprint1(x,pad,pre,lhs,n,seen):
  if nump(x):
    return rprint0(n,pre,x)
  if isinstance(x,str):
    return rprint0(n,pre,x)
  if id(x) in seen:
    return rprint0(n,pre,
                   "... > "+ str(seen[id(x)])) 
  seen[id(x)] = n 
  if isinstance(x,list):
    for y in x:
      n += 1
      rprint1(y,pad,pre+pad,lhs+1,n,seen)
  elif isinstance(x,dict):
    return rprintDict(x,pre,pad,lhs+1,n,seen)
  else:
    rprintDict(x.__dict__,pre,pad,prep,n+1,seen)

def nump(x):


def rprint0(n,pre,x):
  print '%5s | ' % n, pre,x

def rprintDict(x,pre,pad,n,seen):
  for k,v in x.items():
    rprint0(n,pre,":%s" % k)
    rprint1(v,pad,pre+pad,n+1,seen)

rprint(1)
  
rprint({"aa":1,"bb":2})
