2010-04-25 3 views
33

Можно ли использовать концепцию доктрины Python для классов, а не только для функций?Python: использование доктринов для классов

Если да, то где я должен поставить доктрины - в докструмент класса или в докшрин?

Чтобы уточнить, я ищу что-то вроде:

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 

Заранее спасибо,

Адама

+5

Как примечание стороны, всегда наследуют от 'object', а не ничто, так что вы используете * новый стильные классы *. –

+9

За исключением python 3, где есть только классы нового стиля, а 'object' подразумевается без объявленных родителей. – Daenyth

ответ

23

Вы упускаете код на самом деле запустить doctests в нижней части файла:

class Test: 
    <snip> 

if __name__ == "__main__": 
    import doctest 
    doctest.testmod() 

Что касается где поставить тесты:

  • Если он тестирует класс в целом, я бы поместил его в класс docstring.
  • Если он тестирует конструктор, я бы поместил их в docstring конструктора.
  • Если он тестирует метод (как представляется, в этом случае), я бы поместил его в docstring этого метода.
+1

+1 Спасибо! Однако документирование метода кажется немного утомительным, потому что оно требует от меня инициализации объекта для каждого доктрины. –

+4

@Adam: если вам нужно более сложное тестирование, используйте модуль unittest. doctest в первую очередь предназначен для тестирования документации, а не для проверки кода. –

5

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

Что касается того, лучше ли размещать доктрины в docstring класса или конструкторе, я думаю, это зависит от того, что именно вы документируете.

Если docstring дает общий обзор класса и как его использовать, я думаю, что лучше поместить его в класс.

Если docstring конкретно о том, как создавать экземпляры класса, тогда он должен идти в методе __init__.

Помните, что целью доктрин является, прежде всего, самоподтверждающий примерный код в документации, поэтому ИМХО, аспект документации должен иметь приоритет над аспектом тестирования.

Edit:

В вашем примере выше нет кода для выполнения doctest - бег python test.py -v будет выполнять основной код питона, который просто определяет класс.

Вы должны добавить это в конец файла:

if __name__ == "__main__": 
    import doctest 
    doctest.testmod() 

В качестве альтернативы Если вы используете Python 2.6 или более поздней версии запустите его с:

python -m doctest -v test.py 
+0

Спасибо, но почему мой пример не работает? Я пробовал 'python test.py -v' и ничего не получил –

+1

@Adam. Если вы опубликовали полный файл' test.py', вы не сделали 'if __name__ ==" __main__ ": import doctest; doctest.testmod() '; если вы это использовали, никакой выход не означает ошибок. :) – badp

+0

нет, если он добавил -v –

47

Вместо создания объекта в каждом методе, вы могли бы сделать что-то вроде этого:

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

Я не знал о ключевом слове extraglobs. Благодаря! Это массово полезно. –

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