def traverse_cached_fixed(node, depth): def rec(node, depth, cache): if node in cache: print('Already in cache: %s' % node.name) return cache[node] = None print('__'*depth + node.name) for ref in node.refs: rec(ref, depth+1, cache) rec(node, depth, {})