Dealing with dicts in doctest
Peter Otten
__peter__ at web.de
Fri Jul 6 02:54:41 EDT 2018
Steven D'Aprano wrote:
> On Fri, 06 Jul 2018 09:31:50 +1000, Cameron Simpson wrote:
>
>> On 05Jul2018 17:57, Steven D'Aprano
>> <steve+comp.lang.python at pearwood.info> wrote:
>>>I have a function which returns a dict, and I want to use doctest to
>>>ensure the documentation is correct. So I write a bunch of doctests:
>>>
>>>def func(arg):
>>> """blah blah blah
>>>
>>> >>> func(1)
>>> {'a': 1, 'b': 2, 'c': 3}
>>> """
>>>
>>>which is correct, *except* that dict keys have arbitrary order in the
>>>versions of Python I'm using.
>>>
>>>I have three ways of dealing with this. Which do you prefer?
>>
>> Option 4:
>>
>> >>> func(1) == {'a': 1, 'b': 2, 'c': 3}
>> True
>
> Alas, in reality func takes anything up to six arguments, at least one of
> which will be a moderately long sequence requiring two lines:
>
> >>> func([('a', 1), ('bb', 2), ('ccc', 4), ('dddd', 8)],
> ... ('eee', 16), ('ff', 32), ('g', 64)], ...
>
> and the output is similarly long. So making it a one-liner isn't
> generally practical.
In that case: goodbye doctest, hello unittest ;)
With complex or just long setup, underdefined output, and exceptions I
usually ditch doctest, convenient as it may be.
PS: the tinkerer in me wants to provide
import sys
class name(str):
def __repr__(self):
return str(self)
def dh(obj):
if type(obj) is dict:
try:
obj = name(
"{" +
", ".join("%r: %r" % kv for kv in sorted(obj.items()))
+ "}"
)
except TypeError:
pass # might sort by (repr(key), repr(value))
_dh(obj)
_dh = sys.__displayhook__
sys.__displayhook__ = dh
def f(a):
"""
>>> f(dict(a=1, b=2))
{'a': 1, 'b': 2}
"""
return a
More information about the Python-list
mailing list