Python: использование доктрин для классов
Можно ли использовать концепцию доктрины Python для классов, а не только для функций?
Если да, где я должен поставить доктрины - в класс docstring или в конструктор docstring?
Чтобы уточнить, я ищу что-то вроде:
class Test:
"""
>>> a=Test(5)
>>> a.multiply_by_2()
10
"""
def __init__(self, number):
self._number=number
def multiply_by_2(self):
return self._number*2
Спасибо заранее,
Адам
Ответы
Ответ 1
Вам не хватает кода для фактического запуска доктринов в нижней части файла:
class Test:
<snip>
if __name__ == "__main__":
import doctest
doctest.testmod()
Что касается места проведения тестов:
- Если он тестирует класс в целом, я бы поместил их в класс docstring.
- Если он тестирует конструктор, я бы поместил их в конструктор docstring.
- Если он тестирует метод (как представляется, в этом случае), я бы поместил его в этот метод docstring.
Ответ 2
Вместо создания экземпляра объекта в каждом методе вы можете сделать что-то вроде этого:
class Test:
def multiply_by_2(self):
"""
>>> t.multiply_by_2()
10
"""
return self._number*2
if __name__ == "__main__":
import doctest
doctest.testmod(extraglobs={'t': Test()})
Ответ 3
Модуль doctest ищет любые docstrings в файле и выполняет любой встроенный код в нем, поэтому да, возможно, использовать doctest для классов.
Что касается того, лучше ли добавлять доктрины в класс docstring или конструктор, я думаю, это зависит от того, что именно вы документируете.
Если docstring дает общий обзор класса и как его использовать, я думаю, что лучше поместить его в класс.
Если в docstring указано, как создавать экземпляры класса, тогда он должен идти в методе __init__
.
Помните, что целью доктрин является, прежде всего, самоподтверждающий примерный код в документации, поэтому IMHO аспект документации должен иметь приоритет над аспектом тестирования.
Edit:
В приведенном выше примере нет кода для выполнения doctest - запуск python test.py -v
будет выполнять основной код python, который только определяет класс.
Вам нужно добавить это в конец файла:
if __name__ == "__main__":
import doctest
doctest.testmod()
Альтернативно Если вы используете Python 2.6 или более позднюю версию, выполните следующие действия:
python -m doctest -v test.py