[Zope-dev] Re: Unit Test Failures
Jim Fulton
jim at zope.com
Mon Dec 19 11:44:31 EST 2005
Tim Peters wrote:
> ...
>
> [Philipp]
>
>>>Well, if you look closer you find that it uses pprint.pformat which
>
> always outputs the
>
>>>same on all machines (because it provides output sorted by the
>
> dictionary key).
>
> [Tres Seaver]
>
>>I see that in the implementation; it isn't documented as part of
>>pprint's contract, however.
>
>
> It's not part of the implementation either. For example,
>
>
>>>>d = {"z": 1, "m": 2}
>>>>pprint.pprint(d)
>
> {'z': 1, 'm': 2}
>
> That is, it's not true that pprint always sorts a dict for display.
> Looks like Jim's suggested
> from zope.testing.doctestunit import pprint
>
> inherits this insecurity.
No, it doesn't.
>>> from zope.testing.doctestunit import pprint
>>> pprint({"z": 1, "m": 2})
{'m': 2,
'z': 1}
Note both the sorting and the wrapping.
See below.
> In the example above, two things conspire to give "unsorted" output:
>
> 1. pprint(dict) doesn't try to sort at all if _repr(dict) is "short".
>
> 2. On my 32-bit box, hash('z') < hash('m'), which leads to platform accidents
> in dict insertion putting 'z' before 'm' in the "natural" dict
> iteration order:
>
>
>>>>d
>
> {'z': 1, 'm': 2}
>
> Because of #1, pprint passes on that order.
>
> On a 64-bit box, the order may differ (or across Python versions on
> one box if the string hash, or dict insertion, algorithms change).
zope.doctestunit.pprint creates and uses a pretty printer with width
set to 1, so all dicts are "long" and thus sorted.
Note that, in Python 2.4, you can now pass a width to pprint without creating
a separate pretty printer:
>>> from pprint import pprint
>>> pprint({"z": 1, "m": 2})
{'z': 1, 'm': 2}
>>> pprint({"z": 1, "m": 2}, width=1)
{'m': 2,
'z': 1}
So maybe we can phase out the use of docutestunit's pprint.)
Perhaps we should push to get the sorting behavior of pprint
documented to allay your concerns. Better yet, perhaps we can
get all dicts to be sorted.
Jim
--
Jim Fulton mailto:jim at zope.com Python Powered!
CTO (540) 361-1714 http://www.python.org
Zope Corporation http://www.zope.com http://www.zope.org
More information about the Zope-Dev
mailing list