Python verbose true что это
Я думал о предоставлении
через мой исходный код, так что если пользователь передает переменная verbose будет установлен в True и текст будет напечатан.
это правильный подход или есть более простой способ?
Addition: я не прошу способ реализации синтаксического анализа аргументов. Что я знаю, как это делается. Меня особенно интересует многословный вариант. Спасибо!
9 ответов
мое предложение-использовать функцию. Но вместо того, чтобы положить if в функции, которую вы могли бы соблазниться сделать, сделайте это так:
(Да, вы можете определить функцию в if оператор, и он будет определен только в том случае, если условие истинно!)
если вы используете Python 3, где print уже является функцией (или если вы готовы использовать print как функция в 2.x использование from __future__ import print_function ) это даже проще:
таким образом, функция определяется как ничего не делать, если подробный режим выключен (используя лямбда), а не постоянно тестировать verbose флаг.
если пользователь может изменить режим многословия во время бега вашей программы, это был бы неправильный подход (вам понадобится if в функции), но так как вы устанавливаете его с флагом командной строки, вам нужно только принять решение один раз.
затем вы используете например, verboseprint(«look at all my verbosity!», object(), 3) всякий раз, когда вы хотите напечатать «многословный» сообщение.
использовать logging модуль:
все это автоматически переходит в stderr :
для получения дополнительной информации см. Python Docs и уроки.
построение и упрощение ответа @kindall, вот что я обычно использую:
Это затем обеспечивает следующее использование во всем вашем скрипте:
и ваш скрипт можно назвать так:
Мне нужна функция, которая печатает объект (obj), но только если глобальная переменная verbose истинна, иначе она ничего не делает.
Я хочу иметь возможность изменять глобальный параметр «verbose» в любое время. Простота и читаемость для меня имеют первостепенное значение. Поэтому я бы продолжил, как показывают следующие строки:
глобальная переменная «verbose» также может быть установлена из списка параметров.
@kindall это не работает с моей версией Python 3.5. @styles правильно заявляет в своем комментарии, что причиной является дополнительный необязательный ключевые слова
этот ответ навеян код; на самом деле, я собирался просто использовать его как модуль в своей программе, но у меня были ошибки, которые я не мог понять, поэтому Я адаптировал часть.
Регулярные выражения в Python
Регулярные выражения – это небольшой язык, который вы можете использовать внутри Python и многих других языках программирования. Зачастую регулярные выражения упоминаются как “regex”, “regexp” или просто “RE”, от reuglar expressions. Такие языки как Perl и Ruby фактически поддерживают синтаксис регулярных выражений прямо в собственном языке. Python же поддерживает благодаря библиотеки, которую вам нужно импортировать. Основное использование регулярных выражений – это сопоставление строк. Вы создаете правила сопоставления строк, используя регулярные выражения, после чего вы применяете их в строке, чтобы увидеть, присутствуют ли какие-либо сопоставления. «Язык» регулярных выражений на самом деле весьма короткий, так что вы вряд ли сможете использовать для всех своих нужд при сопоставлении строк. Кроме того, работая с задачами, в которых вы используете регулярные выражения, вы можете заметно усложнить процесс, а лечение багов в таком случае очень трудоемкое. В таких случаях вам нужно просто использовать Python.
Обратите внимание на то, что Python – идеальный язык для парсинга текстов согласно его правам, и его можно использовать во всем, что вы делаете с регулярными выражениями. Однако, на это может потребоваться много кода, который будет работать медленнее, чем это делают регулярные выражения, так как они скомпилированы и выполнены в С.
Согласуемые символы
Когда вам нужно найти символ в строке, в большей части случаев вы можете просто использовать этот символ или строку. Так что, когда нам нужно проверить наличие слова «dog», то мы будем использовать буквы в dog. Конечно, существуют определенные символы, которые заняты регулярными выражениями. Они так же известны как метасимволы. Внизу изложен полный список метасимволов, которые поддерживают регулярные выражения Python:
Давайте взглянем как они работают. Основная связка метасимволов, с которой вы будете сталкиваться, это квадратные скобки: [ и ]. Они используются для создания «класса символов», который является набором символов, которые вы можете сопоставить. Вы можете отсортировать символы индивидуально, например, так: [xyz]. Это сопоставит любой внесенный в скобки символ. Вы также можете использовать тире для выражения ряда символов, соответственно: [a-g]. В этом примере мы сопоставим одну из букв в ряде между a и g. Фактически для выполнения поиска нам нужно добавить начальный искомый символ и конечный. Чтобы упростить это, мы можем использовать звездочку. Вместо сопоставления *, данный символ указывает регулярному выражению, что предыдущий символ может быть сопоставлен 0 или более раз. Давайте посмотрим на пример, чтобы лучше понять о чем речь:
Этот шаблон регулярного выражения показывает, что мы ищем букву а, ноль или несколько букв из нашего класса, [b-f] и поиск должен закончиться на f. Давайте используем это выражение в Python:
В общем, это выражение просмотрит всю переданную ей строку, в данном случае это abcdfghijk.
Выражение найдет нашу букву «а» в начале поиска. Затем, в связи с тем, что она имеет класс символа со звездочкой в конце, выражение прочитает остальную часть строки, что бы посмотреть, сопоставима ли она. Если нет, то выражение будет пропускать по одному символу, пытаясь найти совпадения. Вся магия начинается, когда мы вызываем поисковую функцию модуля re. Если мы не найдем совпадение, тогда мы получим None. В противном случае, мы получим объект Match. Чтобы увидеть, как выглядит совпадение, вам нужно вызывать метод group. Существует еще один повторяемый метасимвол, аналогичный *. Этот символ +, который будет сопоставлять один или более раз. Разница с *, который сопоставляет от нуля до более раз незначительна, на первый взгляд.
Символу + необходимо как минимум одно вхождение искомого символа. Последние два повторяемых метасимвола работают несколько иначе. Рассмотрим знак вопроса «?», применение которого выгладит так: “co-?op”. Он будет сопоставлять и “coop” и “co-op”. Последний повторяемый метасимвол это , где а и b являются десятичными целыми числами. Это значит, что должно быть не менее «а» повторений, но и не более «b». Вы можете попробовать что-то на подобии этого:
Это очень примитивный пример, но в нем говорится, что мы сопоставим следующие комбинации: xbz, xbbz, xbbbz и xbbbbz, но не xz, так как он не содержит «b».
Следующий метасимвол это ^. Этот символ позволяет нам сопоставить символы которые не находятся в списке нашего класса. Другими словами, он будет дополнять наш класс. Это сработает только в том случае, если мы разместим ^ внутри нашего класса. Если этот символ находится вне класса, тогда мы попытаемся найти совпадения с данным символом. Наглядным примером будет следующий: [ˆa]. Так, выражения будет искать совпадения с любой буквой, кроме «а». Символ ^ также используется как анкор, который обычно используется для совпадений в начале строки.
Существует соответствующий якорь для конце строки – «$». Мы потратим много времени на введение в различные концепты применения регулярных выражений. В следующих параграфах мы углубимся в более подробные примеры кодов.
Поиск сопоставлений шаблонов
Давайте уделим немного времени тому, чтобы научиться основам сопоставлений шаблонов. Используя Python для поиска шаблона в строке, вы можете использовать функцию поиска также, как мы делали это в предыдущем разделе этой статьи. Вот пример:
В этом примере мы импортируем модуль re и создаем простую строку. Когда мы создаем список из двух строк, которые мы будем искать в главной строке. Далее мы делаем цикл над строками, которые хотим найти и запускаем для них поиск. Если есть совпадения, мы выводим их. В противном случае, мы говорим пользователю, что искомая строка не была найдена.
Есть вопросы по Python?
На нашем форуме вы можете задать любой вопрос и получить ответ от всего нашего сообщества!
Telegram Чат & Канал
Вступите в наш дружный чат по Python и начните общение с единомышленниками! Станьте частью большого сообщества!
Паблик VK
Одно из самых больших сообществ по Python в социальной сети ВК. Видео уроки и книги для вас!
Существует несколько других функций, которые нужно прояснить в данном примере. Обратите внимание на то, что мы вызываем span. Это дает нам начальную и конечную позицию совпавшей строки. Если вы выведите text_pos, которому мы назначили span, вы получите кортеж на подобие следующего: (21, 24). В качестве альтернативы вы можете просто вызвать методы сопоставления, что мы и сделаем далее. Мы используем начало и конец для того, чтобы взять начальную и конечную позицию сопоставления, это должны быть два числа, которые мы получаем из span.
Коды поиска
Существует несколько специальных выражений, которые вы можете искать, используя Python. Вот короткий список с кратким пояснением каждого кода:
Вы можете использовать эти коды внутри класса символа вот так: [\d]. Таким образом, это позволит нам найти любую цифру, находящейся в пределе от 0 до 9. Я настаиваю на том, чтобы вы попробовали остальные коды выхода лично.
Компилирование
Модуль re позволяет вам «компилировать» выражение, которое вы ищите чаще всего. Это также позволит вам превратить выражение в объект SRE_Pattern. Вы можете использовать этот объект в вашей функции поиска в будущем. Давайте используем код из предыдущего примера и изменим его, чтобы использовать компилирование:
Обратите внимание на то, что здесь мы создаем объект паттерна, вызывая compile в каждой строке нашего списка, и назначаем результат переменной – регулярному выражению. Далее мы передаем это выражение нашей поисковой функции. Остальная часть кода остается неизменной. Основная причина, по которой используют компилирование это сохранить выражение для повторного использования в вашем коде в будущем. В любом случае, компилирование также принимает флаги, которые могут быть использованы для активации различных специальных функций. Мы рассмотрим это далее.
Обратите внимание: когда вы компилируете паттерны, они автоматически кэшируются, так что если вы не особо используете регулярные выражения в своем коде, тогда вам не обязательно сохранять компилированный объект как переменную.
Флаги компиляции
Существует 7 флагов компиляции, которые содержатся в Python 3. Эти флаги могут изменить поведение вашего паттерна. Давайте пройдемся по каждому из них, затем рассмотрим, как их использовать.
re.A / re.ASCII
Флаг ASCII указывает Python сопоставлять против ASCII, вместо использования полного Юникода для сопоставления, в сочетании со следующими кодами: w, W, b, B, d, D, s и S. Также существует флаг re.U / re.UNICODE, который используется в целях обратной совместимости. В любом случае, эти флаги являются излишеством, так как Python выполняет сопоставления в Юникоде в автоматическом режиме.
re.DEBUG
Данный флаг показывает информацию о дебаге вашего скомпилированного выражения.
re.I / re.IGNORECASE
Если вам нужно выполнить сравнение без учета регистра, тогда этот флаг – то, что вам нужно. Если ваше выражение было [a-z] и вы скомпилировали его при помощи этого флага, то ваш паттерн сопоставит заглавные буквы в том числе. Это также работает для Юникода и не влияет на текущую локаль.
re.L / re.LOCALE
Данный флаг делает коды: w, W, b, B, d, D, s и S зависимыми от нынешней локали. Однако, в документации говорится, что вы не должны зависеть от данного флага, так как механизм локали сам по себе очень ненадежный. Вместо этого, лучше используйте сопоставление Юникода. Далее в документации говорится, что данный флаг имеет смысл использовать только в битовых паттернах.
re.M / re.MULTILINE
re.S / re.DOTALL
Этот забавный флаг указывает метасимволу «.» (период) сопоставить любой символ. Без этого флага, данный метасимвол будет сопоставлять все, что угодно, но не новую строку.
re.X / re.VERBOSE
Если вы считаете, что ваши регулярные выражения не слишком читабельные, тогда данный флаг – это то, что вам нужно. Он позволяет визуально разделять логические секции ваших регулярных выражений, и даже добавлять комментарии! Пустое пространство внутри паттерна будет игнорироваться, кроме того случая, если классу символа или пробелу предшествует обратная косая черта.
Использование флага компиляции
Давайте уделим немного времени, и посмотрим на простой пример, в котором используется флаг компиляции VERBOSE. Неплохой пример – взять обычную электронную почту и использовать поиск регулярных выражений, таких как r’[w.-]+@[w.-]+’ и добавить комментарии, используя флаг VERBOSE. Давайте посмотрим:
Давайте пройдем дальше и научимся находить множественные совпадения.
Находим множественные совпадения
До этого момента мы научились только находить первое совпадение в строке. Но что если у вас строка, в которой содержится множество совпадений? Давайте посмотрим, как найти одно:
Теперь, как вы видите, у нас есть два экземпляра слова the, но нашли мы только одно. Существует два метода, чтобы найти все совпадения. Первый, который мы рассмотрим, это использование функции findall:
Функция findall будет искать по всей переданной ей строке, и впишет каждое совпадение в список. По окончанию поиска вышей строки, она выдаст список совпадений. Второй способ найти несколько совпадений, это использовать функцию finditer:
Как вы могли догадаться, метод finditer возвращает итератор экземпляров Match, вместо строк, которые мы получаем от findall. Так что нам нужно немного подформатировать результаты перед их выводом. Попробуйте запустить данный код и посмотрите, как он работает.
Сложности с обратными косыми
Обратные косые немного усложняют жизнь в мире регулярных выражений Python. Это связанно с тем, что регулярные выражения используют обратные косые для определения специальных форм, или для того, чтобы искать определенный символ, вместо того, чтобы вызывать его. Как если бы мы искали символ доллара $. Если мы не используем обратную косую для этого, нам нужно просто создать анкор. Проблема возникает по той причине, что Python использует символ обратной косой по той же причине в литеральных строках.
Давайте представим, что вам нужно найти строку на подобии этой: «python». Для её поиска в регулярном выражении, вам нужно будет использовать обратную косую, но, так как Python также использует обратную косую, так что на выходе вы получите следующий поисковый паттерн: «\\python» (без скобок). К счастью, Python поддерживает сырые строки, путем подстановки буквы r перед строкой. Так что мы можем сделать выдачу более читабельной, введя следующее: r”\python”. Так что если вам нужно найти что-то с обратной косой в названии, убедитесь, что используете сырые строки для этой цели, иначе можете получить совсем не то, что ищете.
Подведем итоги
В данной статье мы коснулись только вершины айсберга, под названием регулярные выражения. Существуют целые книги, посвященные регулярным выражениям, однако эта статья, по крайней мере, дает вам базовое представление для начала. Теперь вы можете искать углубленные примеры и обратиться к документации, скорее всего не один и не два раза, пока вы учитесь. Но помните о том, что регулярные выражения – очень удобный и полезный инструмент.
Являюсь администратором нескольких порталов по обучению языков программирования Python, Golang и Kotlin. В составе небольшой команды единомышленников, мы занимаемся популяризацией языков программирования на русскоязычную аудиторию. Большая часть статей была адаптирована нами на русский язык и распространяется бесплатно.
E-mail: vasile.buldumac@ati.utm.md
Образование
Universitatea Tehnică a Moldovei (utm.md)
What is «Verbose» in scikit-learn package of Python? [closed]
Want to improve this question? Update the question so it’s on-topic for Cross Validated.
What is «Verbose» in scikit-learn package of Python? In some models like neural network and svm we can set it’s value to true. This is the documentation:
verbose : bool, default: False Enable verbose output. Note that this setting takes advantage of a per-process runtime setting in libsvm that, if enabled, may not work properly in a multithreaded context.
What is this option?
2 Answers 2
As Matthew states it is generally an option for producing detailed logging information. You should be aware, and will probably notice if you enable verbose > 0, that printing to the screen is generally a very slow process. The algorithm may run an order of magnitude slower, or more, with verbose enabled. Also, in multi-threaded applications, input/output operations are often disabled. Thus as the documentation advises, writing to the standard output may not work in a multi-threaded context.
Verbose is a general programming term for produce lots of logging output. You can think of it as asking the program to «tell me everything about what you are doing all the time». Just set it to true and see what happens.
Not the answer you’re looking for? Browse other questions tagged svm python scikit-learn or ask your own question.
Related
Hot Network Questions
site design / logo © 2021 Stack Exchange Inc; user contributions licensed under cc by-sa. rev 2021.11.26.40833
By clicking “Accept all cookies”, you agree Stack Exchange can store cookies on your device and disclose information in accordance with our Cookie Policy.
Многословный в Python Regex
В этой статье мы узнаем о флаге VERBOSE пакета re и о том, как его использовать.
re.VERBOSE : Этот флаг позволяет вам писать регулярные выражения, которые выглядят лучше и удобнее для чтения, позволяя визуально разделять логические разделы шаблона и добавлять комментарии.
Пробелы в шаблоне игнорируются, за исключением случаев, когда они находятся в классе символов, или когда им предшествует неэкранированная обратная косая черта, или внутри токенов, таких как *?, (?: or (?P Когда строка содержит символ #, который не входит в класс символов и перед ним не стоит обратный слэш без экранирования, все символы от самого левого такого # до конца строки игнорируются.
# Без использования VERBOSE
regex_email = re. compile (r «»»
([0-9a-z /.-]+) # Доменное имя
Давайте рассмотрим пример, в котором пользователя просят ввести свой идентификатор электронной почты, и мы должны проверить его с помощью RegEx. Формат электронного письма следующий:
Примеры:
Ниже приведена реализация Python —
# Python3 программа для показа реализации VERBOSE в RegEX
# RegexObject = re.compile (Регулярное выражение, флаг)
# Компилирует шаблон регулярного выражения в
# объект регулярного выражения
regex_email = re. compile (r «»»
([0-9a-z /.-]+) # Доменное имя
# RegexObject соответствует желаемому
# строка с использованием функции fullmatch
# Если совпадение найдено, search ()
# возвращает экземпляр MatchObject
# Если совпадение найдено, строка действительна
# печатает первую часть / личную информацию об идентификаторе электронной почты
#prints Доменное имя идентификатора электронной почты
#prints Доменное имя верхнего уровня идентификатора электронной почты
# Если совпадение не найдено, строка неверна
doctest — Тестовые интерактивные примеры Python¶
Исходный код: Lib/doctest.py
Модуль doctest выполняет поиск частей текста, которые выглядят как интерактивные сеансы Python, а затем выполняет эти сеансы, чтобы убедиться, что они работают точно так, как показано. Существует несколько распространенных способов использования doctest:
Вот полный, но небольшой модуль примерный:
Если запустить example.py непосредственно из командной строки, doctest работает как волшебство:
И так далее, в конце заканчивая:
Простое использование: проверка примеров в докстрингах¶
Выполнение модуля в виде сценария приводит к выполнению и проверке примеров в докстринговах:
и подробный отчет о всех опробованных примерах напечатается в стандартный вывод вместе с различными резюме в конце.
Эта строка импортирует example.py как автономный модуль и запустит testmod() на нем. Обратите внимание, что это может работать неправильно, если файл является частью пакета и импортирует другие подмодули из этого пакета.
Простое использование: проверка примеров в текстовом файле¶
Другим простым приложением doctest является тестирование интерактивных примеров в текстовом файле. Это можно сделать с помощью функции testfile() :
Запуск doctest.testfile(«example.txt») сообщит о найденной ошибке в документации:
По умолчанию функция testfile() выполняет поиск файлов в каталоге вызывающего модуля. Посмотрите раздел Основной API для описания дополнительных аргументов, которые могут быть используемы, чтобы сказать ему где искать файлы в других местоположениях.
Как это работает¶
Этот раздел подробно рассказывает, как doctest работает: на какие докстринги он смотрит, как он находит интерактивные примеры, что выполнет используемый контекст, который это использует, как он обращается с исключениями и какие опциональные флаги могут быть используемый, чтобы управлять его поведением. Это информация, которую нужно знать, чтобы написать примеры doctest; для получения информации о фактическом выполнении doctest в этих примерах см. следующие разделы.
Какие докстринги исследуются?¶
Модуль docstring и все его функции, класс и метод докстрингов являются поисковыми. Объекты, импортированные в модуль, не являются поисковыми.
Кроме того, если M.__test__ существует и содержит значение true, он должен быть словарем, и каждая запись сопоставляет имени (строки) объекту функции, объекту класса или строки. Функция и объект класса докстрингов, найденные в M.__test__ подвергаются просмотру, и строки рассматриваются как докстринги. В выходных данных появляется ключ K в M.__test__ с именем:
Любые найденные классы рекурсивно просмотренные аналогично тестированию докстрингами, содержащихся в них методах и вложенных классах.
Детали реализации CPython: До версии 3.4 модули расширений, написанные на языке C, не полностью просматривались doctest.
Как распознаются примеры докстринга?¶
В большинстве случаев копи-и-паст интерактивной консольной сессии работает хорошо, но doctest не пытается сделать точную эмуляцию любого специфичного оболочки Python.
Ожидаемый выход не может содержать полностью пустую строку, т.к. такая строка используется для сигнализации конца ожидаемого выхода. Если ожидаемый вывод содержит пустую строку, поместите в каждое место в свой doctest код, где ожидается пустая строка.
Вывод в stdout захватывается, но не в stderr (исключение, трейсбэки захватываются через другое средство).
В противном случае обратная косая черта будет интерпретирована как часть строки. Например, \n выше будет интерпретироваться как символ новой строки. В качестве альтернативы, вы можно удвоить каждую обратную косую черту в версии doctest (и не использовать необработанную строку):
Начальный столбец не имеет значения:
Каков контекст выполнения?¶
Вы можете принудительно использовать свои собственные словарь в качестве контекста выполнения, передав globs=your_dict в testmod() или testfile() вместо него.
Как насчет исключений?¶
Нет проблем, при условии, что трейсбэк является единственным выводом, производимым примером: просто помещая в трейсбэк. [1] Поскольку трейсбэки содержат сведения, которые быстро меняются (например, точные пути к файлам и номера строк), это один из случаев, когда doctest упорно работает, чтобы быть гибким в том, что он принимает.
Ожидаемый выход для исключения должен начинаться с заголовка трейсбэка, который может быть любой из следующих двух строк, с таким же отступом, как в первой строке примера:
За заголовком трейсбэк следует необязательный стек трейсбэка, содержимое которого игнорируется doctest. Стек трейсбэка обычно пропускается или дословно копируется из интерактивного сеанса.
За стеком трейсбэк следует наиболее интересная часть: строки, содержащие тип исключения и подробности. Обычно это последняя строка трейсбэка, но может распространяться на несколько строк, если исключение содержит многострочные подробности:
Последние три строки (начиная с ValueError ) сравниваются с типом и подробностями исключения, а остальные игнорируются.
Лучшая практика должна пропускать стек трейсбэка, если это не добавляет значимой документации к примеру. Так что последний пример, вероятно, лучше, чем:
Некоторые детали вам стоит прочитать один раз, но запоминать их не нужно:
Для некоторого SyntaxError Python показывает позицию символа синтаксической ошибки, используя маркер ^ :
Поскольку строки, показывающие положение ошибки, находятся перед типом особой ситуации и подробностями, они не проверяются доктестом. Например, следующий тест будет пройден, даже если он поместит маркер ^ в неправильное место:
Флаги выбора¶
Первая группа опций определяет семантику теста, контролируя аспекты того, как doctest решает, соответствует ли фактический вывод ожидаемому результату примера:
При определении последовательности из всех пробелов (пробелы и новые строки) рассматриваются как равные. Любая последовательность пробелов в ожидаемом выводе будет соответствовать любой последовательности пробелов в фактическом выводе. По умолчанию пробел должен точно соответсвовать. NORMALIZE_WHITESPACE особенно полезна, когда строка ожидаемого вывода очень длинна, и вы хотите обернуть ее в несколько строк в источнике.
Он также игнорирует имя модуля используемый в отчетах doctest Python 3. Следовательно, оба этих варианта будут работать с указанным флагом, независимо от этого:
Обратите внимание, что ELLIPSIS может также применяться для игнорирования подробностей сообщения об исключении, но такой тест все равно может потерпеть неудачу на основе того, напечатаны ли детали модуля как часть имени исключения. Использование IGNORE_EXCEPTION_DETAIL и подробностей из Python 2.3 также является единственным понятным способом написать доктест, который не заботится о деталях исключения, но продолжает проходить под Python 2.3 или ранее (эти выпуски не поддерживают doctest директивы и игнорируют их как неактуальные комментарии). Например:
проходит для Python 2.3 и более поздних Python версий с указанным флагом, даже несмотря на то, что подробности изменения в Python 2.4 говорят «does not» вместо «doesn’t».
Изменено в версии 3.2: IGNORE_EXCEPTION_DETAIL теперь также игнорирует любую информацию, относящуюся к модулю, содержащему тестируемое исключение.
Если указано, не запускать пример вообще. Это может быть полезно в контекстах, где примеры doctest служат как документацией, так и контрольными примерами, и пример должен быть включен для целей документации, но не должен проверяться. Например, выходные данные примера могут быть случайными; или пример может зависеть от ресурсов, которые будут недоступны для тестов.
Флаг SKIP может также быть используемый для того, чтобы временно «прокомментировать» примеры.
Битовая маска «или» для объединение всех вышеуказанных флагов сравнения.
Вторая группа параметров управляет тем, как регистрируются сбои тестирования:
Если указано, то отказы, связанные с многострочными ожидаемыми и фактическими выходами, отображается с помощью унифицированного diff.
Если указано, отказы, связанные с многострочными ожидаемыми и фактическими выходами будет отображаться с помощью контекстного diff.
Если указано, выводит первый неуспешный пример в каждом доктесте, но подавляет вывод для всех остальных примеров. Он предотвратит появлению отчетов доктестов правильных примеров, сломанных из-за предыдущих сбоев; но это может также скрыть неправильные примеры, которые обрушиваются независимо от первого сбоя. При указании параметра REPORT_ONLY_FIRST_FAILURE остальные примеры по-прежнему выполняются и продолжают учитываться в общем количестве сбоев; подавляются только выходные данные.
Если указан, выйти из первого неудачного примера и не пытайтесь запустить остальные примеры. Таким образом, число зарегистрированных отказов будет не более 1. Этот флаг может быть полезен во время отладки, так как примеры после первой ошибки не дадут результатов отладки.
Добавлено в версии 3.4.
Битовая маска «или» объединяющая все флаги отчетности выше.
Существует также метод регистрации новых имен флагов опций, хотя это не так полезно, по сравнению с расширением внутренностей doctest через подклассы:
doctest. register_optionflag ( name ) ¶
Создать новый флаг опции с заданным именем и вернуть целочисленное значение нового флага. register_optionflag() может быть использован для создания подклассов OutputChecker или DocTestRunner для создания новых опций, поддерживающих вашим подклассы. register_optionflag() всегда следует называть с помощью следующей идиомы:
Директивы¶
Например, этот тест проходит успешно:
Без директивы он не удастся, потому что фактический вывод не содержит двух пробелов перед одноразрядными элементами списка, так и потому, что фактический вывод находится в одной строке. Этот тест также проходит и для него также требуется директива:
Несколько директив могут быть используемый на единственной физической строки, отделенной запятыми:
Если для одного примера используются несколько директив комментариев, то они комбинируются:
Предупреждения¶
doctest серьезно относится к необходимости точного совпадения ожидаемых результатов. Если даже один символ не совпадает, тест завершается неудачей. Это, вероятно, удивит вас несколько раз, поскольку вы узнаете, что Python не даёт точной гарантии выхода. Например, при печати множества, Python не гарантирует, что элемент напечатан в каком-либо определенном порядке, так что тест:
это уязвимо! Один обходной путь состоит в том, чтобы сделать вместо
До Python 3.6, при печати словаря, Python не гарантировал, что пары ключ-значение были напечатаны в каком-либо конкретном порядке.
Есть и другие примеры, но вы поняли идею.
Директива ELLIPSIS предлагает хороший подход для последнего примера:
Числа с плавающей запятой также подвержены небольшим изменениям выходных данных на разных платформах, поскольку Python переносится на библиотеку платформы C для форматирования с плавающей запятой, и библиотеки C сильно различаются по качеству:
Числа в формы I/2.**J безопасны на всех платформах, и я часто изобретаю примеры доктестов для получения чисел этой формы:
Основной API¶
doctest. testfile ( filename, module_relative=True, name=None, package=None, globs=None, verbose=None, report=True, optionflags=0, extraglobs=None, raise_on_error=False, parser=DocTestParser(), encoding=None ) ¶
Все аргументы, кроме filename, являются необязательными и должны быть указаны в ключевой форме.
Необязательный аргумент module_relative указывает, как следует интерпретировать имя файла:
Необязательный аргумент report печатает сводку в конце, когда true, иначе ничего не печатает в конце. В подробном режиме сводка является подробной, иначе сводка очень краткая (фактически пуста, если все тесты прошли).
Необязательный аргумент parser указывает DocTestParser (или подкласс), который должен быть применен для извлечения тестов из файлов. По умолчанию используется обычный парсер (т.е. DocTestParser() ).
Необязательный аргумент encoding указывает кодировку, которая должена быть используема для преобразования файла в Юникод.
doctest. testmod ( m=None, name=None, globs=None, verbose=None, report=True, optionflags=0, extraglobs=None, raise_on_error=False, exclude_empty=False ) ¶
Все аргументы необязательны, и все, кроме m, должны быть указаны в ключевой форме.
Только докстринги, приложенные к объектам, принадлежащие модулю m, являются найденный.
Необязательный аргумент exclude_empty по умолчанию содержит значение false. При значении true объекты, для которых не найдены доктесты, исключаются из рассмотрения. По умолчанию хак для обратной совместимости, так, чтобы код, все еще используя doctest.master.summarize() вместе с testmod() продолжил получение вывода для объектов без тестов. Аргумент exclude_empty для более нового конструктора DocTestFinder по умолчанию содержит значение true.
doctest. run_docstring_examples ( f, globs, verbose=False, name=»NoName», compileflags=None, optionflags=0 ) ¶
Примеры тестов, связанные с объектом f; например, f может быть строкой, модулем, функцией или объектом класса.
Неглубокая копия аргумента словаря globs используется для выполнения контекста.
Если необязательный аргумент verbose содержит значение true, выходные данные генерируются даже при отсутствии ошибок. По умолчанию выходные данные генерируются только в случае отказа примера.
Дополнительный аргумент optionflags работает как для функции testfile() выше.
Unittest API¶
По мере роста вашей коллекции доктестируемых модулей вам будет нужен способ систематизации выполнения всех доктестов. doctest обеспечивает две функции, которые могут быть используемый, чтобы создать наборы тестов unittest из модулей и текстовых файлов, содержащих доктестов. Для интеграции с обнаружением теста unittest включите функцию load_tests() в модуль тестирования:
Существует две основные функции для создания unittest.TestSuite сущности из текстовых файлов и модулей с доктестами:
doctest. DocFileSuite ( *paths, module_relative=True, package=None, setUp=None, tearDown=None, globs=None, optionflags=0, parser=DocTestParser(), encoding=None ) ¶
Передайте один или несколько путей (как строки) текстовым файлам, которые необходимо проверить.
Параметры могут быть предоставлены в виде ключевых аргументов:
Необязательный аргумент module_relative указывает, как следует интерпретировать имена файлов в paths:
Необязательный аргумент parser указывает DocTestParser (или подклассу), который используется для извлечения тестов из файлов. По умолчанию используется обычный парсер (т.е. DocTestParser() ).
Необязательный аргумент encoding указывает кодировку, которая должена быть используема для преобразования файла в Юникод.
doctest. DocTestSuite ( module=None, globs=None, extraglobs=None, test_finder=None, setUp=None, tearDown=None, checker=None ) ¶
Дополнительный аргумент module предоставляет модуль для тестирования. Это может быть объект модуля или (возможно, пунктирное) имя модуля. Если не указан, модуль, вызывающий эту функцию, является используемый.
Дополнительный аргумент extraglobs указывает дополнительный набор глобальных переменных, который объединяется в globs. По умолчанию никакие дополнительные globals не используемый.
Необязательные аргументы setUp, tearDown и optionflags такие же, как и для функции DocFileSuite() выше.
doctest. set_unittest_reportflags ( flags ) ¶
Значение флагов отчетов unittest влияют перед вызовом функции, возвращаемой функцией.
Продвинутый API¶
Базовый API представляет собой простую обертку, предназначенную для упрощения использования doctest. Она является достаточно гибкой и должна удовлетворять потребности большинства пользователей; однако, если требуется более тонкий контроль за тестированием или требуется расширить возможности doctest, следует использовать продвинутое API.
Продвинутое API вращается вокруг двух контейнерных классов, которые применяются для хранения интерактивных примеров, извлеченных из doctest примеров:
Дополнительные классы обработки определяются для поиска, анализа, выполнения и проверки примеров doctest:
Отношения между этими классами обработки суммированы на следующей диаграмме:
Объекты DocTest¶
Коллекция примеров doctest, которые должны выполняться в одном пространстве имен. Аргументы конструктора используются, чтобы инициализировать атрибуты тех же имен.
DocTest определяет следующие атрибуты. Они инициализируются конструктором и не должны изменяться напрямую.
Список Example объектов кодирующих отдельные интерактивные примеры Python, которыми должены быть выполнены этим тестом.
Пространство имен (или глобалы), в котором должны выполняться примеры. Это словарь, отображающий имена на значения. Любые изменения пространства имен, сделанного примерами (такими как биндинг новых переменных), будут отражены в globs после того, как тест будет запущен.
Объекты Example¶
Единоличный интерактивный пример, состоящий из Python инструкции и ожидаемого вывода. Используемые аргументы конструктора для инициализации атрибутов с теми же именами.
Example определяет следующие атрибуты. Они инициализируются конструктором и не должны изменяться напрямую.
Строка, содержащая исходный код примера. Этот исходный код состоящий из одной Python инструкции, и всегда заканчивается новой строкой; при необходимости конструктор добавляет новую строку.
Номер строки в строке, содержащей этот пример, где пример начинается. Номер строки начинается с нуля относительно начала содержащего строку.
Отступы примера в содержащейся строке, т.е. число символов пробела, предшествующее первому приглашению (>>>) примера.
Объекты DocTestFinder¶
Класс обработки используемый для извлечения DocTest ов, относящихся к данному объекту, из его докстрингов и докстрингов содержащихся в нем объектов. DocTest s можно извлечь из модулей, классов, функций, методов, статических методов, классметодов и свойств.
Опциональным аргументом verbose можно показать объекты найденные поисковиком. По умолчанию используется значение False (без вывода).
Опциональный аргумент parser определяет объект DocTestParser (или выпадающая замена), который используется для извлечения доктестов из докстрингов.
Если необязательный аргумент recurse содержит значение false, то DocTestFinder.find() будет проверять только данный объект, но не содержащиеся в нем объекты.
Если необязательный аргумент exclude_empty содержит значение false, то DocTestFinder.find() будет включать тесты для объектов с пустым докстрингами.
DocTestFinder определяет следующий метод:
find ( obj[, name][, module][, globs][, extraglobs] ) ¶
Объекты DocTestParser¶
DocTestParser определяет следующие методы:
Разделить переданную строку на примеры и промежуточный текст и возвращает её как список чередующихся Example ов и строк. Номера строк для Example начинаются с 0. Необязательный аргумент name является именем, идентифицирующим эту строку и используется только для сообщений об ошибках.
Объекты DocTestRunner¶
Дополнительный checker ключевой аргумент определяет объект OutputChecker (или вставная замена), который применяется для сравнения ожидаемого вывода с фактическим выводом doctest примеров.
DocTestParser определяет следующие методы:
Сообщить, что тестраннер собирается обработать данный пример. Этот метод предназначен для того, чтобы позволить подклассам DocTestRunner настраивать их вывод; он не должен вызываться напрямую.
Сообщить, что данный пример выполнен успешно. Этот метод предназначен для того, чтобы позволить подклассам DocTestRunner настраивать их вывод; он не должен вызываться напрямую.
Сообщить, что данный пример не удался. Этот метод предназначен для того, чтобы позволить подклассам DocTestRunner настраивать их вывод; он не должен вызываться напрямую.
report_unexpected_exception ( out, test, example, exc_info ) ¶
Сообщить, что данный пример вызвал непредвиденное исключение. Этот метод предназначен для того, чтобы позволить подклассам DocTestRunner настраивать их вывод; он не должен вызываться напрямую.
run ( test, compileflags=None, out=None, clear_globs=True ) ¶
Запустить примеры в test (объект DocTest ) и отобразить результаты с помощью функции записи out.
compileflags задает набор флагов, которые должны быть используемы компилятором Python при запуске примеров. Если не указано, то по умолчанию используется набор флагов будущего импорта, которые применяются к globs.
Объекты OutputChecker¶
OutputChecker определяет следующие методы:
output_difference ( example, got, optionflags ) ¶
Отладка¶
Doctest предоставляет несколько механизмов для отладки примеров doctest:
Тогда интерактивная сессия Python может быть похожей:
Функции, которые преобразуют доктесты в Python код, и, возможно, запускают синтезированный код в отладчике:
doctest. script_from_examples ( s ) ¶
Преобразование текста с примерами в сценарий.
Аргумент s является строкой, содержащей примеры doctest. Строка преобразуется в скрипт Python, где doctest примеры s преобразуются в обычные код, а все остальное преобразуется в комментарии Python. Созданный сценарий возвращается как строка. Например:
Преобразование doctest для объекта в сценарий.
печатает скриптовую версию функции f() докстринга, с доктестами преобразованными в код, а остальное помещается в комментарии.
Отладка доктестов для объекта.
Используется поверхностная копия module.__dict__ для локального и глобального контекста выполнения.
doctest. debug_src ( src, pm=False, globs=None ) ¶
Отладка доктестов в строка.
Аналогична функции debug() выше, за исключением того, что строка, содержащий примеры doctest, определяется непосредственно через аргумент src.
Необязательный аргумент pm содержит аналогичное значение, что и в функции debug() выше.
Класс DebugRunner и специальные исключения, которые он может поднять, представляют нибольший интерес для авторов тестов фреймворка и будут только коротко изложены здесь. Посмотрите исходный код и особенно DebugRunner докстринг (который является doctest!) для более подробной информацией:
class doctest. DebugRunner ( checker=None, verbose=None, optionflags=0 ) ¶
Сущность DebugRunner может поднять два исключения:
exception doctest. DocTestFailure ( test, example, got ) ¶
Исключение, поднимаемое DocTestRunner для сигнализации о том, что фактические выходные данные doctest примера не соответствуют ожидаемым выходным данным. Аргументы конструктора используются для инициализации атрибутов с теми же именами.
DocTestFailure определяет следующие атрибуты:
Фактический вывод примера.
exception doctest. UnexpectedException ( test, example, exc_info ) ¶
UnexpectedException определяет следующие атрибуты:
Мыльница¶
Как отмечалось во введении, у модуля doctest три основных применения:
У этив видов применений различные требования, и их важно различать. В частности, заполнение ваших докстрингов непонятными тестовыми примерами создает плохую документацию.
При написании докстрингов, тщательно выберите примеры с докстрингами. Это искусство, которое должно быть поначалу изучено и он может быть неестественно на первых порах. Примеры должны добавлять подлинное значение в документацию. Хороший пример часто многословен. Если делать это с осторожностью, примеры будут бесценны для ваших пользователей, и многократно окупит время, необходимое для их сбора и изменения в течение многих лет. Я до сих пор поражаюсь тем, как часто один из моих doctest примеров перестает работать после «безобидной» перемены.
Регрессионное тестирование лучше всего ограничить выделенными объектами или файлами. Существует несколько вариантов организации тестов:
После размещения тестов в модуле сам модуль может быть тестранером. Если тест завершается неуспешно, можно выполнить повторный запуск только неудачного теста во время отладки проблемы. Вот минимальный пример такого тестранера: