Автор оригинала: Pankaj Kumar.
Абстрактное синтаксическое дерево очень сильные особенности в Python. Модуль Python AST позволяет нам взаимодействовать с самим кодом Python и изменять его.
Модуль Python AST
С модулем Python AST мы можем сделать много вещей, как модифицирующее код Python и проверять его. Код может быть проанализирован и изменен до того, как он скомпилирован на Bytecode
форма. Важно понимать, что каждое абстрактное синтаксическое дерево представляет каждый элемент в нашем коде Python в качестве объекта. Мы подробно поймем это в грядущих разделах. Давайте попробуем настоящий код.
Режимы для компиляции кода
Как мы упомянули режим в последнем скрипте выше, есть три режима, в которых код Python может быть скомпилирован. Они есть:
- exec : Мы можем выполнить нормальный код Python, используя этот режим.
- Eval : Чтобы оценить выражения Python, этот режим вернет результат выражения после оценки.
- одинокий : Этот режим работает так же, как Python Shell, которая выполняет одно утверждение за раз.
Выполнение кода
Мы можем использовать модуль AST для выполнения кода Python. Вот образец программы:
import ast code = ast.parse("print('Hello world!')") print(code) exec(compile(code, filename="", mode="exec"))
Давайте посмотрим на вывод этой программы: Как упоминалось выше, мы использовали exec
Режим здесь.
Оценка выражения Python
На основании второго режима, который мы упомянули выше, AST может использоваться для оценки экспрессии Python и получить ответ выражения. Давайте посмотрим на фрагмент кода:
import ast expression = '6 + 8' code = ast.parse(expression, mode='eval') print(eval(compile(code, '', mode='eval')))
Давайте посмотрим на вывод для этой программы: также можно увидеть AST, который был сформирован для вышеуказанного выражения, просто добавьте эту строку с помощью надписания:
print(ast.dump(code))
Это то, что он дает:
Создание многострочных ASTS
До сих пор мы сделали единую строку ASTS и в последнем примере, мы также видели, как они смотрят с помощью свалки. Теперь мы сделаем преобразование многострочного Python Code для AST. Вот образец программы:
import ast tree = ast.parse(''' fruits = ['grapes', 'mango'] name = 'peter' for fruit in fruits: print('{} likes {}'.format(name, fruit)) ''') print(ast.dump(tree))
Давайте посмотрим на вывод этой программы: мы можем посетить каждый узел, изменяя сценарий:
import ast class NodeVisitor(ast.NodeVisitor): def visit_Str(self, tree_node): print('{}'.format(tree_node.s)) class NodeTransformer(ast.NodeTransformer): def visit_Str(self, tree_node): return ast.Str('String: ' + tree_node.s) tree_node = ast.parse(''' fruits = ['grapes', 'mango'] name = 'peter' for fruit in fruits: print('{} likes {}'.format(name, fruit)) ''') NodeTransformer().visit(tree_node) NodeVisitor().visit(tree_node)
Давайте посмотрим на вывод для этой программы: класс посетителей, который мы сделали выше, используемые методами, которые вызывают для каждого узла AST, тогда как с классом трансформатора, он сначала вызывает соответствующий метод узла и, наконец, заменяет его обратным значением способа. Мы можем выполнить методы здесь, добавив эту строку:
tree_node = ast.fix_missing_locations(tree_node) exec(compile(tree_node, '', 'exec'))
Теперь вывод будет:
Когда использовать модуль Python AST?
Многие инструменты тестирования автоматизации, инструменты покрытия кода полагаются на питание абстрактных синтаксических деревьев для анализа исходного кода и найти возможные недостатки и ошибки в коде. Помимо этого, ASTS также используется в:
- Сделать IDes Intelligent и делать функцию, которые все знают как Intellisense Отказ
- Инструменты, такие как Pylint, использует AST для выполнения анализа статического кода
- Пользовательские переводчики Python
Заключение
В этом уроке мы изучали модуль AST, который используется для оценки и изменения кода Python в вашей программе.
Ссылка: API док