Dealing with dicts in doctest

MRAB python at mrabarnett.plus.com
Thu Jul 5 14:56:59 EDT 2018


On 2018-07-05 18:57, Steven D'Aprano 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?
> 
> 
> 1. Re-write the doctest to compare with another dict:
> 
>          >>> actual = func(1)
>          >>> expected = {'a': 1, 'b': 2, 'c': 3}
>          >>> actual == expected
>          True
> 
> I don't like that because it obscures the clear relationship between
> "call the function" -> "here's the output you get".
> 
> 
> 
> 2. Use a pretty-printer function that cleverly sorts the keys before
> printing:
> 
>      >>> _ppr(func(1))
>      {'a': 1, 'b': 2, 'c': 3}
> 
> I don't like that, because the call to the pretty printer obscures the
> call to the function.
> 
> 
> 
> 3. I thought, "what a pity I can't move the pretty printer to the end od
> the line, instead of the beginning, to reduce the emphasis on it". And
> then I thought, yes I can!" and re-wrote the pretty printer to use the
> __ror__ method instead:
> 
>      >>> func(1) | _ppr
>      {'a': 1, 'b': 2, 'c': 3}
> 
> 
> I think that's really clever. Is it too clever? How do you deal with
> dicts in doctests?
> 
> 
> (Ensuring that the dicts only have a single item is not feasible.)
> 
What about sorting the items?

def func(arg):
      """blah blah blah

      >>> sorted(func(1).items())
      [('a', 1), ('b', 2), ('c', 3)]
      """


More information about the Python-list mailing list