Hi,

Interesting case, but I would say we should treat it as a bug in py.test
and manage to handle this or at least fall back gracefully.  So could you
please create an issue at https://bitbucket.org/pytest-dev/pytest/issues/new
and include all the information you provided here directly in the issue
(i.e. the unsortable object and the traceback).

Thanks!
Floris


On 6 April 2015 at 14:37, Edison Gustavo Muenz <[email protected]>
wrote:

> Hello all,
>
> I’m using Python 2.7.7 (The error also happens on Python 2.7.9)
>
> The following code fails:
>
> def test_pretty_printer_screws_up_representation():
>     class UnsortableKey(object):
>         def __init__(self, name):
>             self.name = name
>
>         def __lt__(self, other):
>             raise RuntimeError()
>
>         def __repr__(self):
>             return self.name
>
>         def __hash__(self):
>             return hash(self.name)
>
>         def __eq__(self, other):
>             return self.name == other.name
>
>     assert {UnsortableKey('1'), UnsortableKey('2')} == {UnsortableKey('2')}
>
> >       assert {UnsortableKey('1'), UnsortableKey('2')} == 
> > {UnsortableKey('2')}
> E       assert set([1, 2]) == set([2])
> E         (pytest_assertion plugin: representation of details failed.  
> Probably an object has a faulty __repr__.)
> E         
> X:\etk\coilib50\source\python\coilib50\_pytest\_tests\pytest_almost_equal.py:766:
>  RuntimeError
>
> While debugging, the problem happens in this line
> <https://github.com/python/cpython/blob/2.7/Lib/pprint.py#L199> of
> pprint.py (The PrettyPrinter module).
>
> It assumes that the “object” can have the method sorted() called on it,
> which is not always true. The repr.py module handles this correctly, but
> pprint.py doesn’t.
>
> This is the full traceback <http://pastebin.com/t9a9amcR> (I printed it
> from the the __lt__() method).
>
> I think that this should be handled by pprint.py, however, it is tied to
> the python version being used. Maybe pytest could handle this as a
> workaround this limitation of pprint.py?
>
> Fixing it in pprint.py looks straightforward: just handle it like repr.py
> does, by using the _possiblysorted() method.
>
> Thoughts?
> ​
>
> _______________________________________________
> pytest-dev mailing list
> [email protected]
> https://mail.python.org/mailman/listinfo/pytest-dev
>
>
_______________________________________________
pytest-dev mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pytest-dev

Reply via email to