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.