Oh, sorry.  I see that testmod() is the function.  Does it maybe work
if you pass the globs argument to SymPy's doctest().  It may pass
through.  If not, you may have to modify it so that it does (or
perhaps there's another way to do it; again you'll unfortunately have
to read some source code here).

By the way, is your purpose of making this work with SymPy's doctest
so that you can use ./bin/doctest, or is there something that works in
our doctester but not in the Python one?

Aaron Meurer

On Mon, Aug 22, 2011 at 11:51 AM, Luke <hazelnu...@gmail.com> wrote:
> The main reason I am doing things this way is because this is how I
> learned it when reading docs.python.org:
> http://docs.python.org/py3k/library/doctest.html?highlight=doctest#doctest
>
> The second reason I prefer this way is because it makes it very easy
> to control the execution context of all the doctests within a module,
> through the use of the globs keyword argument to doctest.testmod().
> I'm not sure if it is possible to control the execution context in the
> same way when python -m doctest file.py is used.
>
> No, what you suggested does not work.  sympy's doctest is a function,
> whereas the Python standard library, doctest is a module with a large
> number of functions, testmod() being one of them.
>
> ~Luke
>
> On Mon, Aug 22, 2011 at 10:32 AM, Aaron Meurer <asmeu...@gmail.com> wrote:
>> 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.
>>
>>
>
>
>
> --
> "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.

Reply via email to