diff options
Diffstat (limited to 'Lib/reprlib.py')
| -rw-r--r-- | Lib/reprlib.py | 32 | 
1 files changed, 31 insertions, 1 deletions
| diff --git a/Lib/reprlib.py b/Lib/reprlib.py index 9893c71cb8..f8033604da 100644 --- a/Lib/reprlib.py +++ b/Lib/reprlib.py @@ -1,9 +1,39 @@  """Redo the builtin repr() (representation) but with limits on most sizes.""" -__all__ = ["Repr","repr"] +__all__ = ["Repr", "repr", "recursive_repr"]  import builtins  from itertools import islice +try: +    from _thread import get_ident +except ImportError: +    from _dummy_thread import get_ident + +def recursive_repr(fillvalue='...'): +    'Decorator to make a repr function return fillvalue for a recursive call' + +    def decorating_function(user_function): +        repr_running = set() + +        def wrapper(self): +            key = id(self), get_ident() +            if key in repr_running: +                return fillvalue +            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__') +        wrapper.__annotations__ = getattr(user_function, '__annotations__', {}) +        return wrapper + +    return decorating_function  class Repr: | 
