[Python-ideas] doctest
Steven D'Aprano
steve at pearwood.info
Fri Mar 2 04:48:03 CET 2012
Mark Janssen wrote:
> I just thought of something: isn't the obvious solution is for doctest
> to test the type of an expression's output and if it's in the set of
> unordered types {set, dict} to run sort() on it? Then the docstring author
> can just put the (sorted) output of what's expected....
{set, dict} is not the set of unordered types. The set of unordered types is
without bound: anyone can create their own unordered types.
Even if you limit yourself to the builtins, you forgot frozenset. And then
there are non-builtins in the standard library, like OrderedDict, other types
like dict_proxy.
Sorting the output of an OrderedDict is the wrong thing to do, because the
order is significant. So doctest would need to not just recognise mappings and
sets, and sort them, but *also* recognise mappings and sets which should *not*
be sorted.
Remember too, that by the time doctest.OutputChecker sees the output, it only
sees it as a string. I don't know how much work it would take to introduce
actual type-checks into doctest, but I expect it would be a lot.
And one last problem for you to consider: what happens if the output is
unsortable? Try this dict for size:
{ 2+1j: None, 2-1j: None, float('NAN'): None}
> Perhaps I'm hashing a dead horse, but I really would like to see this added
> to the issue's tracker as a requested feature. I may code up the patch
> myself, but it helps my brain to have it "on the dev stack".
Feel free to add it.
For what it's worth, I am a very strong -1 on any suggestion to give doctest
"Do What I Mean" powers when it comes to unordered objects. But I would
support a "Do What I Say" doctest directive, like NORMALIZE_WHITESPACE,
ELLIPSIS, IGNORE_EXCEPTION_DETAIL, e.g. a directive that tells doctest to
split both the expected and actual output strings on whitespace, then
lexicographically sort them before comparing.
This approach doesn't try to be too clever: it's a dumb, understandable test
which should fit in nicely with the other tests in
doctest.OutputChecker.check_output, perhaps something like this:
if optionflags & IGNORE_WORD_ORDER:
if sorted(got.split()) == sorted(want.split()):
return True
It won't solve every doctest ordering problem, but doctest has other
heuristics which can be fooled too. It is nice and simple, it solves the first
90% of the problem, and it is under the control of the coder.
If you feel like submitting a patch, feel free to use my idea.
--
Steven
More information about the Python-ideas
mailing list