def _recursive_repr(user_function):
    repr_running = set()

    def wrapper(self):
        key = id(self), get_ident()
        if key in repr_running:
            return '...'
        repr_running.add(key)
        try:
            result = user_function(self)
        finally:
            repr_running.discard(key)
        return result

    # Can't use functools.wraps() here because of bootstrap issues
    wrapper.__module__ = getattr(user_function, '__module__')
    wrapper.__doc__ = getattr(user_function, '__doc__')
    wrapper.__name__ = getattr(user_function, '__name__')
    return wrapper

################################################################################
### OrderedDict
################################################################################
Decorator to make a repr function return "..." for a recursive call
dataset/ETHPy150Open baseblack/ReproWeb/3rdParty/python/ordereddict.py/_recursive_repr