Как работать с модулем python ast для анализа if-операторов - PullRequest
0 голосов
/ 24 октября 2019

Мне нужно проанализировать код на python, содержащий операторы if, и я нашел модуль ast: https://docs.python.org/3.8/library/ast.html Каким-то образом документация не требует пояснений. Я нашел здесь пример: https://www.mattlayman.com/blog/2018/decipher-python-ast/, который использует вспомогательный класс ast.NodeVisitor, но я изо всех сил пытаюсь принять этот пример, чтобы получить подробности оператора if.

Код для анализа:

toggleSwitch = False

# check for someValue in the key-value store
if 'someValue' in context['someKey']:
    toggleSwitch = True

Код анализатора:

class Analyzer(ast.NodeVisitor):
    def visit_If(self, node):
        print("If:",node.test.left)
        self.stats["if"].append(node.body)
        self.generic_visit(node)

Я ожидаю получить доступ к элементу someValue в каком-то атрибуте узлавнутри функции visit_If, но я не знаю, как именно это сделать.

1 Ответ

1 голос
/ 24 октября 2019

GreenTreeSnakes имеет довольно обширную документацию по узлам в дереве Python AST.

Я не знаю, действительно ли вы анализируете код в дереве ast или нет, поэтому я включу это здесь.

Разобрать код в дерево:

code = '''toggleSwitch = False

# check for someValue in the key-value store
if 'someValue' in context['someKey']:
    toggleSwitch = True'''

import ast
tree = ast.parse(code)

Затем в вашем классе Analyzer вы можете получить символ someValue из sатрибут узла _ast.Str.

class Analyzer(ast.NodeVisitor):
    def __init__(self):
        self.stats = {'if': []}

    def visit_If(self, node):
        # Add the "s" attribute access here
        print("If:", node.test.left.s)
        self.stats["if"].append(node.body)
        self.generic_visit(node)

    def report(self):
        pprint(self.stats)

>>> a = Analyzer()
>>> a.visit(tree)
If: someValue

Для узла If атрибуты переходят в test (_ast.Compare) → left (_ast.Str) → s (str).

...