AST-функция Python

я хочу проанализировать следующую часть с помощью ast-функций python:

extra_host_conf.setdefault('alias', []).extend( [(u'alias1', ['host1']), (u'alias2', ['host2']), (u'alias3', ['host3 '])])

Мне нужен список из параметра метода extend(). Но важно проверить строковый параметр из метода setdefault(): 'alias'! Также может быть другой строковый параметр, такой как «псевдоним».

Я знаю, как получить строку «псевдоним», и я знаю, как получить список. Но я не знаю, как проверить строку и потом получить список :(

Вот как я получаю строку «псевдоним»:

import ast

class MyVisitor(ast.NodeVisitor):
    def visit_Call(self, node):
        if node.func.attr == "setdefault":
            print ast.literal_eval(node.args[0])
        self.generic_visit(node)

И вот как я получаю список:

import ast
    class MyVisitor(ast.NodeVisitor):
        def visit_Call(self, node):
            if node.func.attr == "extend":
                print ast.literal_eval(node.args[0])
            self.generic_visit(node)

Но как совместить оба? Например: «Если строка «псевдоним», пожалуйста, дайте мне список».

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

ast.literal: [(u'alias1', ['host1']), (u'alias2', ['host2']), (u'alias3', ['host3'])]
Тип: Call

Атрибут: extend
Тип: Атрибут

ast.literal: псевдоним
Тип: Звонок

Атрибут: setdefault
Тип: Атрибут

Имя: extra_host_conf
Тип: Имя

Строка: псевдоним
Тип: Str


person Basssprosse    schedule 25.11.2015    source источник


Ответы (1)


Если вы выгрузите ast для предоставленного вами фрагмента кода, он будет выглядеть так:

Call(func=Attribute(value=Call(func=Attribute(value=Name(id='extra_host_conf', ctx=Load()), attr='setdefault', ctx=Load()), args=[Str(s='alias'), List(elts=[], ctx=Load())], keywords=[], starargs=None, kwargs=None), attr='extend', ctx=Load()), args=[List(elts=[Tuple(elts=[Str(s=u'alias1'), List(elts=[Str(s='host1')], ctx=Load())], ctx=Load()), Tuple(elts=[Str(s=u'alias2'), List(elts=[Str(s='host2')], ctx=Load())], ctx=Load()), Tuple(elts=[Str(s=u'alias3'), List(elts=[Str(s='host3')], ctx=Load())], ctx=Load())], ctx=Load())], keywords=[], starargs=None, kwargs=None)

Используя эту информацию, вы можете проверить соответствующие условия для достижения желаемых результатов.

Вот фрагмент кода, который работает для вашего варианта использования

import ast


class Visitor(ast.NodeVisitor):

    def visit_Call(self, node):
        if isinstance(node.func, ast.Attribute):
            func = node.func
            if func.value.func.attr == 'setdefault' and isinstance(func.value.args[0], ast.Str):
                # Now print the argument list associated with extend call
                if func.value.args[0].s == 'alias' and func.attr == 'extend':                 
                    print ast.dump(node.args[0])


    def run(self, code):
        n = ast.parse(code)
        self.visit(n)

if __name__ == '__main__':
    v = Visitor()
    v.run("extra_host_conf.setdefault('alias', []).extend( [(u'alias1', ['host1']), (u'alias2', ['host2']), (u'alias3', ['host3'])])")

Надеюсь это поможет!

person Manthan Thakar    schedule 25.04.2017