See the below example:
In [33]: test = {x:str(x)*10 for x in range(10)}
In [35]: print test
{0: '0000000000', 1: '1111111111', 2: '2222222222', 3: '3333333333', 4: '4444444444', 5: '5555555555', 6: '6666666666', 7: '7777777777', 8: '8888888888', 9: '9999999999'}
In [34]: test
Out[34]:
{0: '0000000000',
1: '1111111111',
2: '2222222222',
3: '3333333333',
4: '4444444444',
5: '5555555555',
6: '6666666666',
7: '7777777777',
8: '8888888888',
9: '9999999999'}
The output of the print function (__str__) is objectively less readable than the __repr__ output. It's a long line that will word-wrap into multiple lines with no spacing. Both of them are unambiguous enough to let you reconstruct the object with their output.
Wouldn't the opposite outputs make sense here, with __repr__ being the compact representation and __str__ having the more readable linebreaks?