
On Fri, Mar 2, 2012 at 2:01 AM, Éric Araujo <merwok@netwok.org> wrote:
Le 02/03/2012 07:55, Devin Jeanpierre a écrit :
[...] dicts and sets are not idiosyncratic or in any way exceptional. doctest itself should handle them the way a naive user would expect.
This discussion seems to forget a core issue with doctest: The output lines can be *anything* that gets printed. eval-able reprs of Python objects are only a part of the possibilities. That’s why doctest cannot “just call sorted” on the output lines.
Ah, well, it sort of can. You can treat eval-able reprs of python objects specially. But it gets messy. Simple treatments make the treatment of e.g. dicts irreparably inconsistent. in doctest 2:: This is totally fine >>> {-1:1, -2:1} # doctest: +LITERAL_EVAL {-1:1, -2:1} So is this (because doctest2 doesn't care that it was _printed_, just that it was output): >>> print({-1:1, -2:1}) # doctest: +LITERAL_EVAL {-1:1, -2:1} This is not; don't do it bad dog bad bad bad dog (doctest2 has no idea how to separate the repr from the printed text): >>> print(".", {-1:1, -2:1}) # doctest: +LITERAL_EVAL . {-1:1, -2:1} I think maybe this behaviour is a little surprising, or at least a little dumb. The solution I've had in mind is to only do object comparison if the thing in the interpreter window is an expression, rather than a statement. In such a scheme, only the first example would be safe. But aside from not being a very useful distinction anyway, this doesn't agree with the Python interpreter: displaying the last evaluated expression even happens inside a statement. ">>> a;" is totally fine and will display the repr of a. In fact: >>> for d in [{}, {-1:1}, {-2:1}, {-1:1, -2:1}]: d ... {} {-1: 1} {-2: 1} {-2: 1, -1: 1} I can't really think of a way that makes sense and works everywhere, except specifically marking up doctests with things like, "this is a repr'd string; compare by object equality", and "this is a printed string", and so on. That is no small change, but it's tempting. Of course Sphinx would need to be able to turn this into a viewable example. My only worry is that nobody would use it because it's dumb or something, and it's hard to make it not dumb. >>> for d in [{}, {-1:1}, {-2:1}, {-1:1, -2:1}]: # doctest: +schematic ... print("---"); d ... <output> <text>---</text> <eval>{}</eval> <text>---</text> <eval>{-1: 1}</eval> <text>---</text> <eval>{-2: 1}</eval> <text>---</text> <eval>{-2: 1, -1: 1}</eval> </output> (Except seriously.) -- Devin