Мне интересно написать программу, которая использует встроенный в Python AST module для случайного изменения констант в произвольном источнике Python.с использованием модуля ast для преобразования случайных констант в исходный код Python
Это преобразование, вероятно, связано с обходом абстрактного представления синтаксического дерева с использованием операций, определенных модулем AST. Модуль предлагает два варианта: во-первых, ast.walk() возвращает ссылки на все узлы в AST, но не предлагает контекстной информации, что делает невозможным повторное сборку дерева. Во-вторых, в документации описывается второй метод, включающий класс ast.NodeTransformer: несколько источников documentation описывают, как использовать NodeTransformer.
Однако в документации NodeTransformer не упоминается, как случайным образом применять условные замены к AST. В частности, я хотел бы изменить эту функцию, чтобы создать функцию, которая выбирает случайный узел в ast, выбирает константу, связанную с узлом в случайном порядке, и заменяет эту константу случайным образом выбранным константой того же типа.
Я подозреваю, что я пытаюсь понять, как правильно модифицировать NodeTransformer, потому что я редко программирую в объектно-ориентированном стиле (обычно придерживаясь функциональной парадигмы). Надеюсь, указывать мне в правильном направлении легко достанет один из вас.
Я дал ответ ниже, но я не уверен, что действительно понимаю вашу задачу здесь. «Случайный узел в AST» может не иметь каких-либо постоянных узлов, «связанных с ним», или это может быть весь АСТ и иметь все константы в «ассоциированном с ним» кодеке, так что это похоже на нечетную область для случайного выбор. Решение, которое я дал ниже, можно легко распространить на нечто вроде «для каждого постоянного узла, произвольно решающего, изменять или не изменять его значение», но это может или не может удовлетворить ваши потребности. – BrenBarn
Я думаю, что ваш ответ предоставляет необходимую информацию для меня, чтобы исправить правильный ответ на мой оригинальный вопрос. Я вернусь, когда у меня появятся возможности с решением, но пока я уверен, что вы натолкнулись на свой ответ. –