- PVSM.RU - https://www.pvsm.ru -

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

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

PyFence [2] — самопальная утилита-библиотека, которая позволяет следить за соответствием типов во время отладки вашего проекта. PyFence берет информацию о типах из docstring'ов функций в стандартном формате Sphinx [3]. То есть, если у вас уже есть документация, больше ничего делать для использования 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 стоит только при разработке, а не в продакшне, так как из-за проверок возможно падение производительности.

Я буду очень благодарен любому фидбеку [4] и Pull Request'ам [5]!

Автор: hardex

Источник [6]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/python/50154

Ссылки в тексте:

[1] Image: http://instacod.es/84797

[2] PyFence: http://eugeny.github.io/pyfence/

[3] стандартном формате Sphinx: http://pythonhosted.org/an_example_pypi_project/sphinx.html#function-definitions

[4] фидбеку: https://github.com/Eugeny/pyfence/issues

[5] Pull Request'ам: https://github.com/Eugeny/pyfence

[6] Источник: http://habrahabr.ru/post/205134/