New issue 718: Failure to create representation with sets having "unsortable" 
elements
https://bitbucket.org/pytest-dev/pytest/issue/718/failure-to-create-representation-with-sets

Edison Gustavo Muenz:

I’m using Python 2.7.7 (The error also happens on Python 2.7.9)

The following code fails:

```python
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](https://docs.python.org/2/library/pprint.html)).

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](https://hg.python.org/cpython/file/2.7/Lib/repr.py#l122), by using the 
`_possiblysorted()` method.


_______________________________________________
pytest-commit mailing list
pytest-commit@python.org
https://mail.python.org/mailman/listinfo/pytest-commit

Reply via email to