PyFence — самопальная утилита-библиотека, которая позволяет следить за соответствием типов во время отладки вашего проекта. PyFence берет информацию о типах из docstring’ов функций в стандартном формате Sphinx. То есть, если у вас уже есть документация, больше ничего делать для использования PyFence не нужно!
Например, возьмем следующий класс:
class RationalFormatter (object): def format(self, number): """ Stringifies a number to numerator/denominator format Example:: >>> print(RationalFormatter().format(1.25)) 5/4 :param number: input number :type number: float :raises : None :rtype : str """ return '%i/%i' % number.as_integer_ratio() def display(self, number): print(str(number) + ' = ' + self.format(number))
Метод format представляет число в виде дроби, используя метод float.as_integer_ratio()
Пробуем:
>>> from formatter import RationalFormatter >>> f = RationalFormatter() >>> f.display(1.25) 1.25 = 5/4
Вроде работает? Однако все сломается, если передать int, ведь int, к сожалению, .as_integer_ratio() не содержит.
>>> f.display(5) Traceback (most recent call last): File "example.py", line 5, in <module> f.display(5) File "/home/eugeny/Work/pyfence/example_formatter.py", line 18, in display print(str(number) + ' = ' + self.format(number)) File "/home/eugeny/Work/pyfence/example_formatter.py", line 15, in format return '%i/%i' % number.as_integer_ratio() AttributeError: 'int' object has no attribute 'as_integer_ratio'
Впрочем, при использовании PyFence такую проблему можно было бы заметить гораздо раньше:
$ pip install pyfence ... $ fence example.py --fence:strict,stop 1.25 = 5/4 *** PyFence ERROR --------------------------- *** PyFence ERROR PyFence verification failed *** PyFence ERROR :: example_formatter.RationalFormatter.format(<example_formatter.RationalFormatter object at 0x7ff097a47d10>, 5) *** PyFence ERROR in example_formatter.py:2 *** PyFence ERROR number was 5 (int) instead of ['float'] *** PyFence ERROR Aborting
Кроме того, PyFence может проверять типы возникающих в функциях/методах исключений и возвращаемые типы.
Можно также импортировать модуль pyfence в самом проекте, в этом случае не придется использовать отдельную утилиту fence.
Разумеется, использовать fence стоит только при разработке, а не в продакшне, так как из-за проверок возможно падение производительности.
Я буду очень благодарен любому фидбеку и Pull Request’ам!
ссылка на оригинал статьи http://habrahabr.ru/post/205134/
Добавить комментарий