[Python-ideas] doctest
Michael Foord
fuzzyman at gmail.com
Tue Feb 28 00:20:44 CET 2012
On 27 February 2012 19:27, Mark Janssen <dreamingforward at gmail.com> wrote:
> On Fri, Feb 17, 2012 at 10:08 PM, Steven D'Aprano <steve at pearwood.info>
> wrote:
> > Mark Janssen wrote:
> >> 1. Execution context determined by outer-scope doctest defintions.
> >
> > Can you give an example of how you would like this to work?
> >
>
> Sure, I wish I had a good example off the top of my head, but perhaps
> this will convey the idea:
>
> class MyClass():
> """Yadda Yadda: foo's bars.
>
> >>> m = MyClass({some, sufficiently, interesting, initialization})
> #tPOINT1: this variable (m) now accessible by all methods.
> "foobar check" #POINT2: possible output here is a useful test case
> not well-definable elsewhere without losing context.
> """
>
> def method1(self, other):
> """Method method method method.
>
> >>> m.method("foo") #Now we see m is already defined and useable.
> "bar"
> """
>
> def meth2(self, other):
> """Method to foo all bars
>
> >>> m.method("bar") #would have to decide whether a fresh m is
> redefined with each innerscope doctest (if we want side-effects to
> carry across inner doctests).
>
> (END)
>
> This is a basic example, sorry it's rather crude. There's probably a
> better example. (Think establishing a network socket connection or
> something in the class' doc which is then used by all the methods, for
> example.)
>
> >> 2. Smart Comparisons that will detect output of a non-ordered type
> >> (dict/set), lift and recast it and do a real comparison.>
> >
> > I would love to see a doctest directive that accepted differences in
> output
> > order, e.g. would match {1, 2, 3} and {3, 1, 2}. But I think that's a
> hard
> > problem to solve in the general case.
>
> I think this would be as simple as lifting the (string) output and
> doing an eval("{1,2,3}")=={3,2,1}, or (for security) using
> ast.literal_eval like Devin suggested.
>
>
How will that handle not-particularly-obscure code like this:
>>> class Foo(object):
... def __init__(self, a):
... self.a = a
... def __repr__(self):
... return '<Foo a=%r>' % self.a
...
>>> a = {Foo(1), Foo(2), Foo(3)}
>>> b = {Foo(4), Foo(5), Foo(6)}
>>> {'first': a, 'second': b}
{'second': set([<Foo a=4>, <Foo a=6>, <Foo a=5>]), 'first': set([<Foo a=3>,
<Foo a=2>, <Foo a=1>])}
I don't think a *general* solution for unordered types is even possible
because you can't parse arbitrary reprs.
All the best,
Michael
> > I'd like a #3 as well: an abbreviated way to spell doctest directives,
> > because they invariably push my tests well past the 80 character mark.
>
> Hmm, seem like an alias could be defined easily enough, but I'll try
> to think about this when I have more time.
>
> mark
> _______________________________________________
> Python-ideas mailing list
> Python-ideas at python.org
> http://mail.python.org/mailman/listinfo/python-ideas
>
--
http://www.voidspace.org.uk/
May you do good and not evil
May you find forgiveness for yourself and forgive others
May you share freely, never taking more than you give.
-- the sqlite blessing http://www.sqlite.org/different.html
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-ideas/attachments/20120227/7f3a5633/attachment.html>
More information about the Python-ideas
mailing list