Python的AST功能

时间:2015-11-25 06:39:32

标签: python abstract-syntax-tree

我想用python的函数分析以下部分:

  

extra_host_conf.setdefault('别名',[])。extend(   [(' alias1',[' host1']),(u' alias2',[' host2']),(u'别名3&#39 ;,   [' host3上'])])

我需要extend() - method-parameter中的列表。但重要的是要检查setdefault()方法中的字符串参数:'别名'!可能还有另一个字符串参数作为'别名'。

我知道如何获取字符串'别名'我知道如何获得清单。但我不知道如何检查字符串,然后得到列表:(

我是如何得到字符串'别名':

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'] )   (你' alias3',[' host3'])]
  输入:致电

     

属性:延长
  输入:属性

     

ast.literal:别名
  输入:致电

     

属性:setdefault
  输入:属性

     

名称:extra_host_conf
  输入:名称

     

字符串:别名
  键入:Str

1 个答案:

答案 0 :(得分:0)

如果你为你提供的代码片段转储了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'])])")

希望这有帮助!

相关问题