]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-109653: Just import `recursive_repr` in `dataclasses` (gh-109822)
authorNikita Sobolev <mail@sobolevn.me>
Tue, 5 Mar 2024 18:12:00 +0000 (21:12 +0300)
committerGitHub <noreply@github.com>
Tue, 5 Mar 2024 18:12:00 +0000 (13:12 -0500)
Lib/dataclasses.py

index 3335821f3f32e94b6f47a43f8f683c4bfe5b2378..45ce5a98b51ae06b30eb68133a89d6cbc07e0d2b 100644 (file)
@@ -4,10 +4,9 @@ import copy
 import types
 import inspect
 import keyword
-import functools
 import itertools
 import abc
-import _thread
+from reprlib import recursive_repr
 from types import FunctionType, GenericAlias
 
 
@@ -245,25 +244,6 @@ _ATOMIC_TYPES = frozenset({
     property,
 })
 
-# This function's logic is copied from "recursive_repr" function in
-# reprlib module to avoid dependency.
-def _recursive_repr(user_function):
-    # Decorator to make a repr function return "..." for a recursive
-    # call.
-    repr_running = set()
-
-    @functools.wraps(user_function)
-    def wrapper(self):
-        key = id(self), _thread.get_ident()
-        if key in repr_running:
-            return '...'
-        repr_running.add(key)
-        try:
-            result = user_function(self)
-        finally:
-            repr_running.discard(key)
-        return result
-    return wrapper
 
 class InitVar:
     __slots__ = ('type', )
@@ -322,7 +302,7 @@ class Field:
         self.kw_only = kw_only
         self._field_type = None
 
-    @_recursive_repr
+    @recursive_repr()
     def __repr__(self):
         return ('Field('
                 f'name={self.name!r},'
@@ -632,7 +612,7 @@ def _repr_fn(fields, globals):
                                 for f in fields]) +
                      ')"'],
                      globals=globals)
-    return _recursive_repr(fn)
+    return recursive_repr()(fn)
 
 
 def _frozen_get_del_attr(cls, fields, globals):