PyFence: верификация типов для Python

от автора

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/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *