Рубрики
Без рубрики

Изучение абстрактного синтаксического дерева

Hacktoberfest заставил меня выйти из зоны комфорта и внести свой вклад в различные кодовые базы. Один из них, Python Linter дал мне воздействие, используя Abstract Syntax Tree Python. Tagged with Python, AST, учебник, программирование.

Hacktoberfest заставил меня выйти из зоны комфорта и внести свой вклад в различные кодовые базы. Один из них, а Python Linter дал мне экспозицию, используя Abstract Syntax Tree Python.

Что такое абстрактное синтаксисное дерево?

Абстрактное синтаксисное дерево (AST)-это способ представить синтаксис языка программирования как иерархическую деревьевую структуру.

По сути, мы можем взять черту такого кода:

pressure = 30

и преобразовать его в структуру дерева:

Википедия имеет немного другое определение:

AST обычно является результатом фазы анализа синтаксиса компилятора. Он часто служит промежуточным представлением программы на несколько этапов, которые требуется компилятор, и оказывает сильное влияние на конечный результат компилятора.

Таким образом, AST является одним из этапов создания скомпилированного кода. Определенно кажется, что мы приближаемся к тому, что понимает машина!

Что это позволяет нам сделать, так это пройти через структуру программы и сообщить о любых вопросах (аналогично Intellisense/Linters) или даже изменить написанный код.

Python предоставляет библиотеку для анализа и навигации по абстрактному синтаксическому дереву и удачно называется AST.

Используя предыдущий пример, мы можем создать AST, используя следующую команду:

import ast
code = 'pressure = 3'
tree = ast.parse(code)

Просто печать дерево не будет отображать нужную структуру и узлы, которые мы хотим. Вместо этого мы можем создать посетителя узла, который пройдет по дереву и даст нам подробности о каждом из узлов:

class Visitor(ast.NodeVisitor):
    def generic_visit(self, node):
            print(type(node).__name__)
        ast.NodeVisitor.generic_visit(self, node)

Теперь, если мы создадим экземпляр этого класса для посетителей, когда мы назовуте visitor.visit (код), мы получим следующий вывод:

Модуль Назначить Имя Магазин Численность

Для Линтера это весьма полезно, чтобы увидеть, является ли какие -либо из этих узлов недействительными. Хороший пример этого – когда у вас есть, если Верно:… Избыточный оператор, если он всегда оценивается с одним и тем же результатом.

Когда мы бегаем на посещение, если правда: … мы получаем следующее:

Модуль Если NameConstant Expr Эллипсис

В этом случае Верно Значение – это NameConstant Анкет Посетитель AST позволяет нам создавать конкретные методы, которые вызываются, когда конкретный ClassName посещается. Это достигается с помощью следующего синтаксиса:

def visit_{className}(self, node):

В этом случае мы хотим посетить любой узел, и проверить его условие испытания, чтобы убедиться, что это не просто NameConstant (Верно, ложь или нет). Вот где AST документация довольно полезен, так как вы можете видеть, какие свойства доступны для каждого типа узла. Мы можем получить доступ к условию Node.test таким образом:

statement = "If statement always evaluates to {} on line {} "
def visit_If(self, node):
    condition= node.test
   if isinstance(condition, ast.NameConstant):
      print(statement.format(condition.value, node.lineno))
   ast.NodeVisitor.generic_visit(self, node)

Запуск этого в нашем предыдущем примере дает нам хорошее подробное сообщение:

Если утверждение всегда оценивается в True On Line 1

Вы не ограничиваются только «посещением» узла в AST. Используя еще один из классов Pythons, вы можете использовать аст Nodetransformer изменить их тоже! Это приводит к действительно крутым возможностям, таким как вставка временных строк кода для тестирования покрытия кода вашей программы или даже транспилирования на другие языки

Я рекомендую проверить следующие ресурсы, если вы хотите использовать AST в Python:

Змеи зеленого дерева – недостающие документы Python AST

^ Этот даже включает в себя живой веб -визуализатор, который может помочь быстро увидеть структуру кода!

Официальная документация AST

Копия кода в этом посте можно найти здесь

Следующее, что я хотел бы исследовать, это использование Nodetransformer для потенциально транспилирования от Python на другой язык, такой как JavaScript.

Спасибо за чтение! Поделитесь своим опытом/вариантами использования для AST в комментариях ниже!

Оригинал: “https://dev.to/sheldonnunes/exploring-the-abstract-syntax-tree-2ce8”