[Biopython-dev] Post Biopython 1.62 release, clean-up after dropping Python 2.5
Peter Cock
p.j.a.cock at googlemail.com
Fri Aug 30 10:22:26 EDT 2013
Thanks Sergei - that clarified things.
Unfortunately this doesn't just break our convenience __main__ trick for
running the doctests in any single module, it also breaks doing it via:
$ python run_tests.py doctest
This means we'd have to update the doctests to also use Python 3
style print functions... which may be premature (we'll need to do
this at some point though).
How about the less ambitious plan of replacing lines like this:
print variable
with:
print(variable)
This will be understood as a print function call on Python 3 (and work),
and will also work on Python 2 (without the future import) where it will
be parsed as redundant parentheses.
Note you can't use this trick where more than one variable is printed,
because then on Python 2 the brackets will create a tuple instead.
Peter
On Fri, Aug 30, 2013 at 2:28 PM, Sergei Lebedev <superbobry at gmail.com> wrote:
> Sure, a common pattern for a lot of BioPython modules seems to be:
>
> # +from __future__ import print_function
>
>
> def foo():
> """A docstring with print statement.
>
> >>> print "foo"
> foo
> """
> print "Running foo ..."
> # +print("Running foo ...")
>
>
> if __name__ == "__main__":
> import doctest
> doctest.testmod()
>
> where foo is some function, which uses print statement in its body. Since we
> want to switch from print statements to print function we replace print
> "Running foo ..." with a print() call and add from __future__ import ... to
> the beginning of the module.
>
> What happens if we try to run the doctests after we've switched to
> print_function?
>
> $ python /tmp/foo.py
> **********************************************************************
> File "/tmp/foo.py", line 7, in __main__.foo
> Failed example:
> print "foo"
> Exception raised:
> Traceback (most recent call last):
> File ".../doctest.py", line 1254, in __run
> compileflags, 1) in test.globs
> File "<doctest __main__.foo[0]>", line 1
> print "foo"
> ^
> SyntaxError: invalid syntax
> **********************************************************************
> 1 items had failures:
> 1 of 1 in __main__.foo
> ***Test Failed*** 1 failures.
>
> So, enabling print_function makes doctests using print statement fail with a
> SyntaxError, as shown by the example above. Thus, if we want to get rid of
> print statement in the code we have no other choice but to do the same it in
> the doctests.
>
> Sergei
>
>
>
> On August 30, 2013 at 5:14:14 PM, Peter Cock (p.j.a.cock at googlemail.com)
> wrote:
>
> On Fri, Aug 30, 2013 at 1:58 PM, Sergei Lebedev <superbobry at gmail.com>
> wrote:
>>> (8) Excluding doctests and the Tutorial, use print function
>>> rather than print statement. e.g. replace this:
>>
>> Unfortunately we cannot exclude doctests, because 'from __future__' import
>> is module wide, thus the 'doctest.testmod()' will raise a SyntaxError on
>> docstrings with print statement.
>>
>> Sergei
>
> Could you clarify this? Does this cause a problem via:
>
> [Tests]$ python run_tests.py doctest
>
> If you have a small example, copy & paste the "git diff" output here.
>
> Peter
More information about the Biopython-dev
mailing list