Обложка канала

Протестировал

Фильтрованный контент о тестировании и качестве ПО.

Протестировал

6 лет назад
Открыть в
Когда я только узнал про программирование с помощью контрактов, то попробовал сделать модуль для контрактов на Go. Получилось не очень удачно. Но мне написал автор другого похожего модуля с предложением сделать общую реализацию, которую можно было бы в официальные модули добавить. На этом все и застряло. В Питоне мне кажется проще реализовать контракты с помощью декораторов.

Вот @orsinium пишет про контрактное программирование в Питоне:

PyContracts. Условия задаются в своём особом синтаксисе в виде строк. Довольно интересный подход. Позволяет писать условия кратко и ёмко, в виде этаких схем. Правда, как результат, IDE такое не подсветит, да и нормальные схемы (типа marshmallow и PySchemes) без боли не использовать.

Pycontract. Автор этого модуля пошёл ещё дальше и реализовал модуль, который позволяет описывать контракты в docstring'ах, также в своём синтаксисе. Причём он подошёл серьезно и написал PEP с предложением включить это в стандартную библиотеку питона. Если бы это приняли, IDE умела бы это подсвечивать. Но нет.
PEP, Модуль и примеры
Итоге я перепробовал около 30 модулей для контрактного программирования в виде обычных декораторов, принимающих в качестве контрактов любые функции. Но они все недостаточно хороши. То в качестве исключения поднимают Exception, то не реализуют инвариант, то работают только с какими-то своими сложными интерфейсами валидаторов, без возможности задать обычное lambda-выражение... В общем, встречайте почти идеальный модуль. Возможно, первый, у которого внутренности сделаны в терминах ООП, а не жуткой функциональщины, в которой и автор, вероятно, уже не ориентируется. https://github.com/orsinium/deal

Расскажите про свой опыт использования контрактов при написании кода.