On Thu, Mar 1, 2012 at 8:49 PM, Devin Jeanpierre <span dir="ltr"><<a href="mailto:jeanpierreda@gmail.com">jeanpierreda@gmail.com</a>></span> wrote:<br><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

<div class="im">On Thu, Mar 1, 2012 at 9:31 PM, Mark Janssen <<a href="mailto:dreamingforward@gmail.com">dreamingforward@gmail.com</a>> wrote:<br>
> I just thought of something:  isn't the obvious solution is for doctest to<br>
> test the type of an expression's output and if it's in the set of unordered<br>
> types {set, dict} to run sort() on it?  Then the docstring author can just<br>
> put the (sorted) output of what's expected....<br>
<br>
</div>It's the solution people seem to think of first, so it's definitely<br>
fairly obvious. It's not a big improvement, though. The original<br>
problem is that dict order shouldn't matter, but in doctest it does,<br>
making dicts unusable in the normal doctest style. Making it a<br>
specific dict order be the prominent one lets you use dicts in<br>
doctest, but you have to sort the dicts and rewrite the doctest to<br>
take that into account. </blockquote><div><br></div><div>Personally I never copy from the interactive prompt, but instead write my doctest and, if I'm in the mood to copy and paste, copy from the failed doctest error message (which is nicely indented just like my tests).  So it would work fine if things were sorted.</div>

<div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">And even so, some dicts cannot be represented<br>
this way. For example, the dict {1:2, "hello": world} cannot be sorted<br>
in Python 3, so it won't work in this scheme.<br></blockquote><div><br></div><div>You could always use a heuristic sorting, e.g., sorted((str(key), key) for key in dict)</div><div><br></div><div>To make this work you have to write a repr() replacement that is somewhat sophisticated.  Though it still wouldn't save you from:</div>

<div><br></div><div>class Something:</div><div>    def __repr__(self):</div><div>        return '<Something attr=%r>' % (self.attr)</div><div><br></div><div>where attr is a dict or some other object with an awkward repr.  That's the part I'm unsure of.  Of course no eval will help you there either.  I don't know if there's any way to really replace repr's implementation everywhere; I'm guessing there isn't.</div>

<div><br></div><div>  Ian</div><div><br></div></div>