Skip to content

Commit

Permalink
'saferepr' handles classes with broken __getattribute__
Browse files Browse the repository at this point in the history
  • Loading branch information
nicoddemus committed May 5, 2020
1 parent 4787fd6 commit 508da0d
Show file tree
Hide file tree
Showing 3 changed files with 17 additions and 1 deletion.
1 change: 1 addition & 0 deletions changelog/7145.bugfix.rst
@@ -0,0 +1 @@
Classes with broken ``__getattribute__`` methods are displayed correctly during failures.
2 changes: 1 addition & 1 deletion src/_pytest/_io/saferepr.py
Expand Up @@ -20,7 +20,7 @@ def _format_repr_exception(exc: BaseException, obj: Any) -> str:
except BaseException as exc:
exc_info = "unpresentable exception ({})".format(_try_repr_or_str(exc))
return "<[{} raised in repr()] {} object at 0x{:x}>".format(
exc_info, obj.__class__.__name__, id(obj)
exc_info, type(obj).__name__, id(obj)
)


Expand Down
15 changes: 15 additions & 0 deletions testing/io/test_saferepr.py
Expand Up @@ -154,3 +154,18 @@ def test_pformat_dispatch():
assert _pformat_dispatch("a") == "'a'"
assert _pformat_dispatch("a" * 10, width=5) == "'aaaaaaaaaa'"
assert _pformat_dispatch("foo bar", width=5) == "('foo '\n 'bar')"


def test_broken_getattribute():
"""Classes with broken __getattribute__ methods are handled correctly by saferepr() (#7145)"""

class SomeClass:
def __getattribute__(self, attr):
raise RuntimeError

def __repr__(self):
raise RuntimeError

assert saferepr(SomeClass()).startswith(
"<[RuntimeError() raised in repr()] SomeClass object at 0x"
)

0 comments on commit 508da0d

Please sign in to comment.