【问题标题】:Python's AST-FunctionPython 的 AST 函数
【发布时间】:2017-04-25 21:00:18
【问题描述】:

我想用python的ast-functions分析以下部分:

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

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

我知道如何获取字符串 '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'])]
类型:调用

属性:扩展
类型:属性

ast.literal:别名
类型:调用

属性:setdefault
类型:属性

名称:extra_host_conf
类型:姓名

字符串:别名
类型:Str

【问题讨论】:

    标签: python abstract-syntax-tree


    【解决方案1】:

    如果你为你提供的代码 sn-p 转储 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)
    

    使用此信息,您可以检查适当的条件以达到您想要的结果。

    这是适用于您的用例的代码 sn-p

    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'])])")
    

    希望这会有所帮助!

    【讨论】:

      猜你喜欢
      • 2016-06-11
      • 2011-11-19
      • 2019-12-20
      • 2022-06-10
      • 2012-03-25
      • 1970-01-01
      • 2018-05-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多