Определите методы посещения для использования только в объекте ast.While - PullRequest
2 голосов
/ 16 мая 2019

Я пытаюсь написать Пилинговый плагин (проверяющий) и объект, который я хочу проверить, является ast.While, особенно тело. Я заинтересован в сделанных операциях по переменным теста сравнения (работаю только с ast.While что тестовое выражение является ast.Compare объектом). Итак Интересные случаи: ast.AugAssign или ast.Assign или кусок от подписки, если объекты в сравнении являются int, ...

Я определил методы для ast.Name, ast.Attribute, ... для извлечения имя переменной. Но проблема в том, что я хочу такое поведение только в теле ast.While, потому что в моем классе есть атрибуты (TestWhile(ast.NodeVisitor)), которая хранит информацию, поэтому я не хотите, чтобы они были изменены вне тела ast.While. Должен ли я определить, например, visit_Name() в определении visit_While метода?

Спасибо.

1 Ответ

0 голосов
/ 18 мая 2019

Я бы сделал это, создав два класса посетителей. Один будет отвечать за идентификацию ast.While узлов, другой за посещение узлов внутри узла while.

class WhileVisitor(ast.NodeVisitor):

    def visit_While(self, node):
        body_visitor = BodyVisitor()
        body_visitor.visit(node)
        return


class BodyVisitor(ast.NodeVisitor):

    def visit_Assign(self, node):
        # do stuff

    # define methods to visit any other nodes of interest.

Разделяя ответственность за идентификацию узлов и обработку их тел, вы можете быть уверены, что будут обрабатываться только узлы внутри узлов.

...