gh-113570: reprlib.repr does not use builtin __repr__ for reshadowed builtins (GH-113577)

This commit is contained in:
George Pittock 2024-10-17 17:34:37 +01:00 committed by GitHub
parent ad3eac1963
commit 04d6dd23e2
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 71 additions and 5 deletions

View file

@ -36,6 +36,17 @@ def recursive_repr(fillvalue='...'):
return decorating_function
class Repr:
_lookup = {
'tuple': 'builtins',
'list': 'builtins',
'array': 'array',
'set': 'builtins',
'frozenset': 'builtins',
'deque': 'collections',
'dict': 'builtins',
'str': 'builtins',
'int': 'builtins'
}
def __init__(
self, *, maxlevel=6, maxtuple=6, maxlist=6, maxarray=5, maxdict=4,
@ -60,14 +71,24 @@ class Repr:
return self.repr1(x, self.maxlevel)
def repr1(self, x, level):
typename = type(x).__name__
cls = type(x)
typename = cls.__name__
if ' ' in typename:
parts = typename.split()
typename = '_'.join(parts)
if hasattr(self, 'repr_' + typename):
return getattr(self, 'repr_' + typename)(x, level)
else:
return self.repr_instance(x, level)
method = getattr(self, 'repr_' + typename, None)
if method:
# not defined in this class
if typename not in self._lookup:
return method(x, level)
module = getattr(cls, '__module__', None)
# defined in this class and is the module intended
if module == self._lookup[typename]:
return method(x, level)
return self.repr_instance(x, level)
def _join(self, pieces, level):
if self.indent is None: