2015-07-05 5 views
3

У меня есть опыт работы на Python, но только недавно натолкнулся на широкое использование docstrings. Я иду через Financial Market Simulator (FMS) исходный код, и когда я открываю его в PyCharm я вижу следующий подсветка синтаксиса (скриншот фрагмента кода one of the modules в FMS):Докстопы и встроенный код Python; значение синтаксиса «>>>»

script-screenshot01

Почему заявления после того, как «>>>» выделены так, как будто они исполняемы? Из того, что я прочитал docstrings, как на официальной документации, так и на SO (например, here) Я думаю, что эти утверждения не должны выполняться, но подсветка синтаксиса меня сбивает с толку, что заставляет меня думать, что «>>>» маркер кода в пределах docstring, который нужно выполнить. Или это просто ошибка ПиКарма? Ни одна из документации не упоминает ничего, что связано с этим, и я беспокоюсь, если я что-то упустил.

PS: Для записи, просмотр кода в SublimeText не воспроизводит то же поведение.

ответ

5

Заявления, написанные >>> в докстроках, - doctests.

Он позволяет протестировать ваш код, запустив примеры, встроенные в документацию, и подтвердив, что они дают ожидаемые результаты. Он анализирует текст справки, чтобы найти примеры, запускает их, а затем сравнивает выходной текст с ожидаемым значением.

В вашем случае PyCharm выполнил дополнительную задачу выделения кода python в docstrings. Это не повлияет на выполнение вашей обычной функции, поэтому вам не нужно беспокоиться об этом.

Пример:
Допустим, у меня есть сценарий, названный doctest_simple_addition, в котором я написал несколько doctests для add() функции, где некоторые тестовые примеры дает надлежащую производительность и некоторые вызывает исключение. Тогда я могу проверить, что моя функция дает ожидаемые результаты, запустив эти доктрины.

doctest_simple_addition.ру

def add(a,b): 
    """ 
    >>> add(1, 2) 
    3 

    >>> add(5, 3) 
    8 

    >>> add('a', 1) 
    Traceback (most recent call last): 
     ... 
    TypeError: cannot concatenate 'str' and 'int' objects 
    """ 

    return a + b 

Для запуска doctests используйте doctest в качестве основной программы через -m опции для интерпретатора. Как правило, во время тестирования не производится никакого вывода. Вы можете добавить опцию -v, и doctest затем распечатает подробный журнал того, что он пытается с помощью сводки в конце.

Doctest ищет строки, начинающиеся с приглашения переводчика, >>>, чтобы найти начало тестового примера. Экземпляр теста заканчивается пустой строкой или следующей подсказкой интерпретатора.

$ python -m doctest -v doctest_simple_addition.py 

Trying: 
    add(1, 2) 
Expecting: 
    3 
ok 
Trying: 
    add(5, 3) 
Expecting: 
    8 
ok 
Trying: 
    add('a', 1) 
Expecting: 
    Traceback (most recent call last): 
     ... 
    TypeError: cannot concatenate 'str' and 'int' objects 
ok 
1 items had no tests: 
    doctest_simple_addition 
1 items passed all tests: 
    3 tests in doctest_simple_addition.add 
3 tests in 2 items. 
3 passed and 0 failed. 
Test passed. 

Примечание: Когда doctest видит линию в traceback заголовка (либо Traceback (most recent call last): или Traceback (innermost last):, в зависимости от версии Python вы работаете), он пропускает вперед, чтобы найти тип исключения и сообщения, не обращая внимания на промежуточные линии полностью.
Это делается потому, что пути в трассировке зависят от того, где модуль установлен в файловой системе на данной системе, и было бы невозможно написать переносные тесты, поскольку путь изменился бы от системы к системе.

3

Ваша интуиция верна, они должны быть выполнены. Но не волнуйтесь, это строки doctest. Они не будут мешать нормальному выполнению модуля, поэтому все в порядке. Признавая их, PyCharm просто помогает.

+0

Спасибо! Итак, 'doctest' запускает все внутренне после' >>> 'и сравнивает вывод с ожидаемым выходом, указанным в очереди на строке сразу ниже? Кроме того, в примере, который я предоставил, есть вызовы функций «Traceback ...» и «MissingParameter..'», которые фактически выполняются, или просто текст, напечатанный на экране в качестве сообщения, когда тест не удается? – avg

+1

@avg Добро пожаловать! Да, точно, все, что следует за строкой '>>>', - это ожидаемый результат. «Traceback» и «MissingParameter» являются лишь частью вывода, в этом случае трассировка. В начале у вас есть заголовок трассировки, а в конце - тип исключения в последней строке. В случае исключений все между этими двумя строками игнорируется. – NZP

+0

Я собирался принять ваш ответ, но @rahul написал тот, который является более полным, поэтому я собираюсь принять его. Спасибо, что нашли время ответить. – avg

1

Поведение, которое вы видите, является частью поддержки тестирования Python, доступной в Pycharm.

Опция настройки называется «Анализ кода Python в строки документации» и доступен под Python Integrated Tools:

Если выбран этот флажок, PyCharm выдвигает на первый план пример кода и выполняет проверку синтаксиса и проверки кода. Если этот флажок установлен не , фрагменты кода внутри docstrings не анализируются.

Вы можете отключить его, если хотите.

Информация о онлайн-документации, как run tests и view their results.

+0

Спасибо, я только недавно начал использовать PyCharm, и это очень полезно. – avg

Смежные вопросы