Python: принимать строки Unicode как обычные строки в doctests

Написание doctests для метода, который сокращает словарь путем поиска переданного ключевого слова в ключах исходного словаря и возврата нового сокращенного словаря. Моя строка документации выглядит следующим образом:

def abbreviate_dict(key_word, original_dict):
    """
    >>> orig_dict = {apple_stems: 2, apple_cores: 5, apple_seeds: 3}
    >>> abbreviate_dict('apple', orig_dict)
    {'cores': 5, 'seeds': 3, 'stems': 2}
    """
   etc.
   return new_dict

Функция работает, но когда я запускаю doctest py.test, функция не проходит тест, поскольку возвращает строки в формате unicode. Я программно не переключаю строки на юникод в своей функции, но я знаю, что python 2.7 возвращает в юникоде.

Expected:
    {'cores': 5, 'seeds': 3, 'stems': 2}
Got:
    {u'cores': 5, u'seeds': 3, u'stems': 2}

Как я могу заставить doctest признать, что Unicode и обычные строковые выходные данные одинаковы?


person af3ld    schedule 22.06.2016    source источник
comment
Как я могу заставить doctest признать, что Unicode и обычные строковые выходные данные одинаковы? - плохой ход. Они совсем не одинаковы. Очень важно всегда знать, работаете ли вы со строками байтов или со строками Unicode.   -  person user2357112 supports Monica    schedule 22.06.2016
comment
С другой стороны, совместимости с Python 2/3 может быть трудно достичь с помощью doctests, поскольку типы строк отображаются по-разному в Python 2 и 3.   -  person user2357112 supports Monica    schedule 22.06.2016
comment
Это не одно и то же, но цель функции не в том, чтобы расшифровать типы строк, а в том, чтобы манипулировать и возвращать словарь. Я хочу увидеть, возвращается ли правильный словарь, как можно провести тест для проверки соответствия между выходными данными функции?   -  person af3ld    schedule 22.06.2016


Ответы (1)


Вы можете установить флаг ALLOW_UNICODE (глобально или для каждого теста). Подробнее см. в документах по pytest.

Пример:

[pytest]
doctest_optionflags = ALLOW_UNICODE

or

# content of example.rst
>>> get_unicode_greeting()  # doctest: +ALLOW_UNICODE
'Hello'
person The Compiler    schedule 23.06.2016
comment
Полезный ответ. Не уверен, почему так много ответов на связанные вопросы типа «Doctest не может этого сделать, он хромает, не используйте его». :( - person jwg; 22.09.2017