Рассмотрим следующий сценарий демо:unicode_literals и doctest в Python 2.7 и Python 3.5
# -*- coding: utf-8 -*-
from __future__ import division
from __future__ import unicode_literals
def myDivi():
"""
This is a small demo that just returns the output of a divison.
>>> myDivi()
0.5
"""
return 1/2
def myUnic():
"""
This is a small demo that just returns a string.
>>> myUnic()
'abc'
"""
return 'abc'
if __name__ == "__main__":
import doctest
extraglobs = {}
doctest.testmod(extraglobs=extraglobs)
doctest переходит на Python 3.5, но не работает на Python 2.7.9.
Странная вещь, тест деления работает, но тест unicode терпит неудачу.
Я видел различные вопросы, в том числе следующие
- Multi version support for Python doctests
- Doctest not recognizing __future__.division
- Python: accept unicode strings as regular strings in doctests
- Python doctests and unicode
- Doctest fails due to unicode leading u
, но все они несколько разные (например, они устарели (ссылаясь на Py 2.6 или Py 3.0), оператор импорта находится внутри доктрины, а не во всем мире, используйте pytest вместо стандартного доктрины, переключитесь на разные утверждения и т. д.)
Тем не менее, я пробовал различные альтернативы на основе этих вопросов, в том числе например
if __name__ == "__main__":
import doctest
import __future__
extraglobs = {'unicode_literals': __future__.unicode_literals}
doctest.testmod(extraglobs=extraglobs)
или
def myUnic():
"""
This is a small demo that just returns a string.
>>> myUnic()
u'abc' # doctest: +ALLOW_UNICODE
"""
return 'abc'
, но она по-прежнему не работает, либо на Python 2 или 3 или дает другие ошибки.
Есть ли способ заставить его пройти как 3.5+, так и 2.7.9+, без уродливых хаков? Я также использую эти docstrings для генерации документации, поэтому я бы предпочел сохранить их более или менее такими, какими они есть.
связанный: https://bugs.python.org/issue3955 – matth