Well, I don't know why you are doing things this way, but clearly
python -m doctest file.py or ./bin/doctest file.py do not run __name__
== `__main__`.  Does it work if you replace "import doctest" with
"from sympy import doctest"?

Aaron Meurer

On Sun, Aug 21, 2011 at 2:32 PM, Luke Peterson <hazelnu...@gmail.com> wrote:
> If the file has the if statement in it (as below), then running python on the 
> file (without -m doctest) *will* run the doctests, and you can easily control 
> the execution context of the doctests by doing any required imports/setup in 
> this if statement and passing handles to testmod via the globs keyword 
> argument.  This is part of the Python standard library, so I would consider 
> it also to be pretty standard, and I have found this functionality quite 
> useful.
>
> ~Luke
>
> On Aug 21, 2011, at 11:43 AM, Aaron Meurer <asmeu...@gmail.com> wrote:
>
>> On Sun, Aug 21, 2011 at 12:32 PM, Luke <hazelnu...@gmail.com> wrote:
>>> On Sun, Aug 21, 2011 at 10:42 AM, Aaron Meurer <asmeu...@gmail.com> wrote:
>>>> On Sat, Aug 20, 2011 at 7:34 PM, Luke <hazelnu...@gmail.com> wrote:
>>>>> On Sat, Aug 20, 2011 at 3:37 PM, Aaron Meurer <asmeu...@gmail.com> wrote:
>>>>>> I don't know of any doctests in SymPy that do this.  Why can't you put
>>>>>> imports in each doctest?  I'd highly recommend it.
>>>>>
>>>>> The reason for not wanting to do the imports is as follows.  We have a
>>>>> class (Kane) that implements an algorithm, and there are many steps to
>>>>> that algorithm.  Setting up the proper execution context for each
>>>>> doctest requires that each docstring replicate a lot of import
>>>>> statements and code that are done in previous docstrings.  Looking at
>>>>> the docstrings for this gets cumbersome pretty quickly because of all
>>>>> the "setup" code that is required to be in each and every docstring.
>>>>
>>>> Maybe create a helper function that does it all for you and import that.
>>>>
>>>>>
>>>>>>
>>>>>> To see if this can be done, you'll probably have to do what I would
>>>>>> end up doing, which is to read the source.  Look at
>>>>>> sympy/utilities/runtests.py and also the source for Python's
>>>>>> doctest.py ("import doctest; doctest??" in IPython will tell you where
>>>>>> it is locally).  I can tell you that how our doctest runner works is
>>>>>> that it subclasses the Python doctest, over writting stuff that is
>>>>>> broken there in at least one Python version.
>>>>>>
>>>>>
>>>>> Ok. Something in testmod() must be different from the default doctest
>>>>> module, I'll give it a look.
>>>>>
>>>>>> By the way, when you say "running Python on this file," do you mean
>>>>>> running "python -m doctest myfile.py"?
>>>>>>
>>>>>
>>>>> I mean "python myfile.py".
>>>>
>>>> Running a file and running the doctests in the file are different
>>>> things.  What does python -m doctest myfile.py give?
>>>>
>>>
>>> Yes, they are two different things.  It fails in the same way running
>>> sympy's doctest on the file fails.  The reason is that the code at the
>>> end of the file is not run:
>>> if __name__ == "__main__":
>>>    import doctest
>>>    from sympy import Symbol
>>>    doctest.testmod(globs={'Symbol' : Symbol})
>>>
>>> According to the python man page, the -m flag "runs the file as a
>>> script", which I presume means "from top to bottom", and __name__ !=
>>> "__main__" within the execution context.  What is the main motivation
>>> for executing doctests in this fashion as opposed to the one which
>>> requires the above if statement?
>>>
>>> Is it safe to assume that all sympy doctests should be written such
>>> that they will pass when "python -m doctest mymodule.py" is run?  Or
>>> is there a way to change how the doctests are run for a particular
>>> file, i.e., so that doctests are tested by the if statement above when
>>> "python mymodule.py" is run?
>>>
>>> Luke
>>
>> -m runs the doctest.py file as a script, with your file as the command
>> line argument.  This is the standard way to run the standard Python
>> doctest on a file.  Just running python myfile.py should not run any
>> doctests, just the code in the module itself.
>>
>> Aaron Meurer
>>
>>>
>>>> Aaron Meurer
>>>>
>>>>>
>>>>> ~Luke
>>>>>
>>>>>> Aaron Meurer
>>>>>>
>>>>>> On Sat, Aug 20, 2011 at 3:54 PM, Luke <hazelnu...@gmail.com> wrote:
>>>>>>> Hello,
>>>>>>>  I would like to alter the execution context of some doctests so that
>>>>>>> I don't have redundant import statements in every doctest.  Python's
>>>>>>> doctest.testmod() function allows one to do all the common import
>>>>>>> statements in one place (at the bottom of your module), and pass those
>>>>>>> names so that all doctests have those names available when they are
>>>>>>> run.
>>>>>>>
>>>>>>> A simple example of this is:
>>>>>>> #!/usr/bin/env python
>>>>>>> def foo(bar):
>>>>>>>    """
>>>>>>>    >>> x = Symbol('x')
>>>>>>>    >>> print(x)
>>>>>>>    x
>>>>>>>
>>>>>>>    """
>>>>>>>    pass
>>>>>>>
>>>>>>> if __name__ == "__main__":
>>>>>>>    import doctest
>>>>>>>    from sympy import Symbol
>>>>>>>    doctest.testmod(globs={'Symbol' : Symbol})
>>>>>>>
>>>>>>>
>>>>>>> Running python on this file works (the tests pass even though Symbol
>>>>>>> isn't explicitly imported within the foo function's doctest).
>>>>>>> However, sympy's doctest fails with these errors:
>>>>>>>
>>>>>>> ../../bin/doctest doctest_globaldict.py
>>>>>>> ====================================================================================
>>>>>>> test process starts
>>>>>>> =====================================================================================
>>>>>>> executable:   /usr/bin/python  (2.7.1-final-0)
>>>>>>> architecture: 64-bit
>>>>>>> cache:        yes
>>>>>>> ground types: python
>>>>>>>
>>>>>>> sympy/physics/doctest_globaldict.py[1] F
>>>>>>>
>>>>>>>                                          [FAIL]
>>>>>>>
>>>>>>> ______________________________________________________________________________________________________________________________________________________________________________________________
>>>>>>> ____________________________________________________________________________
>>>>>>> sympy.physics.doctest_globaldict.foo
>>>>>>> ____________________________________________________________________________
>>>>>>> File "/home/luke/repos/sympy/sympy/physics/doctest_globaldict.py",
>>>>>>> line 4, in sympy.physics.doctest_globaldict.foo
>>>>>>> Failed example:
>>>>>>>    x = Symbol('x')
>>>>>>> Exception raised:
>>>>>>>    Traceback (most recent call last):
>>>>>>>      File "/usr/lib/python2.7/doctest.py", line 1254, in __run
>>>>>>>        compileflags, 1) in test.globs
>>>>>>>      File "<doctest sympy.physics.doctest_globaldict.foo[0]>", line
>>>>>>> 1, in <module>
>>>>>>>        x = Symbol('x')
>>>>>>>    NameError: name 'Symbol' is not defined
>>>>>>> **********************************************************************
>>>>>>> File "/home/luke/repos/sympy/sympy/physics/doctest_globaldict.py",
>>>>>>> line 5, in sympy.physics.doctest_globaldict.foo
>>>>>>> Failed example:
>>>>>>>    print(x)
>>>>>>> Exception raised:
>>>>>>>    Traceback (most recent call last):
>>>>>>>      File "/usr/lib/python2.7/doctest.py", line 1254, in __run
>>>>>>>        compileflags, 1) in test.globs
>>>>>>>      File "<doctest sympy.physics.doctest_globaldict.foo[1]>", line
>>>>>>> 1, in <module>
>>>>>>>        print(x)
>>>>>>>    NameError: name 'x' is not defined
>>>>>>>
>>>>>>> ====================================================================
>>>>>>> tests finished: 0 passed, 1 failed, in 0.04 seconds
>>>>>>> =====================================================================
>>>>>>> DO *NOT* COMMIT!
>>>>>>>
>>>>>>>
>>>>>>> Is there way to achieve this same functionality using sympy's doctest?
>>>>>>>
>>>>>>> ~Luke
>>>>>>>
>>>>>>>
>>>>>>> --
>>>>>>> "Those who would give up essential liberty to purchase a little
>>>>>>> temporary safety deserve neither liberty nor safety."
>>>>>>>
>>>>>>> -- Benjamin Franklin, Historical Review of Pennsylvania, 1759
>>>>>>>
>>>>>>> --
>>>>>>> You received this message because you are subscribed to the Google 
>>>>>>> Groups "sympy" group.
>>>>>>> To post to this group, send email to sympy@googlegroups.com.
>>>>>>> To unsubscribe from this group, send email to 
>>>>>>> sympy+unsubscr...@googlegroups.com.
>>>>>>> For more options, visit this group at 
>>>>>>> http://groups.google.com/group/sympy?hl=en.
>>>>>>>
>>>>>>>
>>>>>>
>>>>>> --
>>>>>> You received this message because you are subscribed to the Google 
>>>>>> Groups "sympy" group.
>>>>>> To post to this group, send email to sympy@googlegroups.com.
>>>>>> To unsubscribe from this group, send email to 
>>>>>> sympy+unsubscr...@googlegroups.com.
>>>>>> For more options, visit this group at 
>>>>>> http://groups.google.com/group/sympy?hl=en.
>>>>>>
>>>>>>
>>>>>
>>>>>
>>>>>
>>>>> --
>>>>> "Those who would give up essential liberty to purchase a little
>>>>> temporary safety deserve neither liberty nor safety."
>>>>>
>>>>> -- Benjamin Franklin, Historical Review of Pennsylvania, 1759
>>>>>
>>>>> --
>>>>> You received this message because you are subscribed to the Google Groups 
>>>>> "sympy" group.
>>>>> To post to this group, send email to sympy@googlegroups.com.
>>>>> To unsubscribe from this group, send email to 
>>>>> sympy+unsubscr...@googlegroups.com.
>>>>> For more options, visit this group at 
>>>>> http://groups.google.com/group/sympy?hl=en.
>>>>>
>>>>>
>>>>
>>>> --
>>>> You received this message because you are subscribed to the Google Groups 
>>>> "sympy" group.
>>>> To post to this group, send email to sympy@googlegroups.com.
>>>> To unsubscribe from this group, send email to 
>>>> sympy+unsubscr...@googlegroups.com.
>>>> For more options, visit this group at 
>>>> http://groups.google.com/group/sympy?hl=en.
>>>>
>>>>
>>>
>>>
>>>
>>> --
>>> "Those who would give up essential liberty to purchase a little
>>> temporary safety deserve neither liberty nor safety."
>>>
>>> -- Benjamin Franklin, Historical Review of Pennsylvania, 1759
>>>
>>> --
>>> You received this message because you are subscribed to the Google Groups 
>>> "sympy" group.
>>> To post to this group, send email to sympy@googlegroups.com.
>>> To unsubscribe from this group, send email to 
>>> sympy+unsubscr...@googlegroups.com.
>>> For more options, visit this group at 
>>> http://groups.google.com/group/sympy?hl=en.
>>>
>>>
>>
>> --
>> You received this message because you are subscribed to the Google Groups 
>> "sympy" group.
>> To post to this group, send email to sympy@googlegroups.com.
>> To unsubscribe from this group, send email to 
>> sympy+unsubscr...@googlegroups.com.
>> For more options, visit this group at 
>> http://groups.google.com/group/sympy?hl=en.
>>
>
> --
> You received this message because you are subscribed to the Google Groups 
> "sympy" group.
> To post to this group, send email to sympy@googlegroups.com.
> To unsubscribe from this group, send email to 
> sympy+unsubscr...@googlegroups.com.
> For more options, visit this group at 
> http://groups.google.com/group/sympy?hl=en.
>
>

-- 
You received this message because you are subscribed to the Google Groups 
"sympy" group.
To post to this group, send email to sympy@googlegroups.com.
To unsubscribe from this group, send email to 
sympy+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/sympy?hl=en.

Reply via email to