def formatTrace(trace):
 def formatWithName(obj):
  if hasattr(obj, 'name'):
   return u'{0} ({1})'.format(obj, obj.name)
  else:
   return u'{0}'.format(obj)
 result = []
 lineage = []
 for (parent, child) in trace:
  if ((not lineage) or (lineage[(-1)] is not parent)):
   if (parent in lineage):
    while (lineage[(-1)] is not parent):
     lineage.pop()
   else:
    if (not lineage):
     result.append(u'{0}\n'.format(formatWithName(parent)))
    lineage.append(parent)
  result.append((u'  ' * len(lineage)))
  result.append(u'-> {0}\n'.format(formatWithName(child)))
 return u''.join(result)

def formatTrace ( trace ) : def formatWithName ( obj ) : if hasattr ( obj , 'name' ) : return u'{0} ({1})' . format ( obj , obj . name ) else : return u'{0}' . format ( obj ) result = [ ] lineage = [ ] for ( parent , child ) in trace : if ( ( not lineage ) or ( lineage [ ( - 1 ) ] is not parent ) ) : if ( parent in lineage ) : while ( lineage [ ( - 1 ) ] is not parent ) : lineage . pop ( ) else : if ( not lineage ) : result . append ( u'{0}\n' . format ( formatWithName ( parent ) ) ) lineage . append ( parent ) result . append ( ( u'  ' * len ( lineage ) ) ) result . append ( u'-> {0}\n' . format ( formatWithName ( child ) ) ) return u'' . join ( result )
format a trace as a visual indication of the messages propagation through various observers .