Python - побочные эффекты / инструменты анализа чистоты?
Существуют ли какие-либо инструменты для анализа побочных эффектов / чистоты в Python, аналогичные http://jppa.sourceforge.net/ в Java?
1 ответ
Я не знаю ни одного из существующих, но вот некоторые общие подходы к созданию:
Анализ исходных файлов в виде текста - использование регулярных выражений для поиска того, что показывает функцию, определенно не является чистым - например,
global
ключевое слово. Для практических целей большинство прилично написанных функций, которые имеют толькоreturn
Заявление в теле, скорее всего, будет чистым. С другой стороны, если функция не имеетreturn
утверждение, оно либо бесполезно, либо нечисто.Анализ функций в исходном файле в виде кода. Если тестирование функции в отдельности производит
NameError
вы знаете, что это либо нечисто (потому что у него нет доступа к переменным на более высоком уровне), либо в нем есть ошибка (имеется в виду переменная до того, как она определена или что-то подобное), однако последний случай должен быть покрыты обычным тестированием. Функция inspect module isfunction может быть полезна, если вы хотите это сделать.Для каждой тестируемой функции, если она имеет относительно небольшую область (например, один вход, который может быть 1, 2, 3 или 4), вы можете полностью протестировать все возможные входы и получить определенный ответ таким образом. Если он имеет ограниченный или конечный, но большой домен (например, все действительные числа от 0 до 1000 (бесконечный, но ограниченный) или все целые числа от -12345 до 67890), то вы можете попробовать выбрать выборку входных данных в этом домене, и использовать это, чтобы получить вероятность чистоты. Однако этот подход может быть не очень полезным, так как домен функции вряд ли будет указан, поэтому вы можете проверить его, только если написали функцию, и в этом случае вам, возможно, не понадобится анализировать ее.
Делать что-то умное, возможно, в сочетании с вышеуказанными методами. Например, создание нейронной сети с вводом в качестве текста функции и выводом как вероятности того, что она будет чистой. Затем вы могли бы обучить сеть на примерах функций, которые вы знаете как чистые или нечистые, а затем использовать их для функций неизвестной чистоты.
Редактировать: я вернулся к этому вопросу после того, как кто-то проголосовал с новыми знаниями! ast
Модуль должен облегчить написание своего собственного инструмента анализа, такого как этот, поскольку он позволяет вам получить доступ к абстрактному синтаксическому дереву кода. Должно быть довольно легко пройти через это дерево и посмотреть, есть ли что-то, что мешает чистоте. Это гораздо лучший подход, чем анализ исходных файлов в виде текста, и в какой-то момент я мог бы попробовать это. Наконец, этот вопрос также может быть полезным, а также этот, который в основном является дубликатом этого вопроса.