Funny behaviour with __future__ and doctest between 2.6 and 3.1

Mattsteel mattsteel at hotmail.it
Fri Jan 29 17:21:55 CET 2010


Hi Peter.
Sadly (for me), you're right... then the only way to use doctest to
work both in 2.6 and 3.1 (without modifications between them) is
something like this:

#!/usr/bin/env python
'''
>>> str(concat('hello','world'))
'hello world'
'''
from __future__  import unicode_literals
def concat( first, second ):
    return first + ' ' + second
if __name__ == "__main__":
    import doctest
    doctest.testmod()

Is there any way to avoid using str(...) to protect the string?
M.


---------------------------------------
     #!/usr/bin/env python
    '''
    >>> concat('hello','world')
    'hello world'
    '''
    from __future__  import unicode_literals
    def concat( first, second ):
        return first + ' ' + second
    if __name__ == "__main__":
        import doctest
        doctest.testmod()


On 29 Gen, 16:50, Peter Otten <__pete... at web.de> wrote:
> Mattsteel wrote:
> > Hello all.
> > I'm using Python 2.6.4 and Python 3.1.1.
> > My wish is to code in a 3.1-compliant way using 2.6, so I'm importing
> > the __future__ module.
> > I've found a funny thing comparing the two folliwing snippets that
> > differ for one line only, that is the position of __future__ import
> > (before or after the doc string).
>
> > Well, I understand the subtle difference but still I wander what
> > really happen behind the scenes.
>
> Are you sure? The second script has no module docstring, just a string
> literal somewhere in the module, and therefore no tests. You can see that by
> running it with the verbose option -v. Also,
>
> from __future__ import unicode_literals
>
> doesn't affect the repr() of a unicode instance. But the interactive
> interpreter invokes repr() on the result before it is printed:
>
> >>> from __future__ import unicode_literals
> >>> "yadda"
>
> u'yadda'
>
> > Comments are welcome.
>
> > ---------------------------------------
> >     #!/usr/bin/env python
> >     '''
> >     >>> concat('hello','world')
> >     'hello world'
> >     '''
> >     from __future__  import unicode_literals
> >     def concat( first, second ):
> >         return first + ' ' + second
> >     if __name__ == "__main__":
> >         import doctest
> >         doctest.testmod()
> > ---------------------------------------
> >     #!/usr/bin/env python
> >     from __future__  import unicode_literals
> >     '''
> >     >>> concat('hello','world')
> >     'hello world'
> >     '''
> >     def concat( first, second ):
> >         return first + ' ' + second
> >     if __name__ == "__main__":
> >         import doctest
> >         doctest.testmod()
> > ---------------------------------------
>
> > The first way shows the following failure:
>
> > ---------------------------------------
> >   Failed example:
> >       concat('hello','world')
> >   Expected:
> >       'hello world'
> >   Got:
> >       u'hello world'
>
> > ---------------------------------------
>
> > Regards.
>
> > Matt.
>
>




More information about the Python-list mailing list