Python 的 AST 函数
Python's AST-Function
我想用 python 的 ast 函数分析以下部分:
extra_host_conf.setdefault('alias', []).extend(
[(u'alias1', ['host1']), (u'alias2', ['host2']), (u'alias3',
['host3'])])
我需要来自 extend()-method-parameter 的列表。但是检查 setdefault() 方法中的字符串参数很重要:'alias'!也可能有另一个字符串参数 'alias'.
我知道如何获取字符串 '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)
但是如何把两者放在一起呢?喜欢:"If the string is 'alias' please give me the list."
我写了一些方法来获取不同部分的类型。希望对您有所帮助:
ast.literal: [(u'alias1', ['host1']), (u'alias2', ['host2']),
(u'alias3', ['host3'])]
Type: Call
Attribute: extend
Type: Attribute
ast.literal: alias
Type: Call
Attribute: setdefault
Type: Attribute
Name: extra_host_conf
Type: Name
String: alias
Type: Str
如果您转储您提供的代码片段的 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'])])")
希望对您有所帮助!
我想用 python 的 ast 函数分析以下部分:
extra_host_conf.setdefault('alias', []).extend( [(u'alias1', ['host1']), (u'alias2', ['host2']), (u'alias3', ['host3'])])
我需要来自 extend()-method-parameter 的列表。但是检查 setdefault() 方法中的字符串参数很重要:'alias'!也可能有另一个字符串参数 'alias'.
我知道如何获取字符串 '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)
但是如何把两者放在一起呢?喜欢:"If the string is 'alias' please give me the list."
我写了一些方法来获取不同部分的类型。希望对您有所帮助:
ast.literal: [(u'alias1', ['host1']), (u'alias2', ['host2']), (u'alias3', ['host3'])]
Type: CallAttribute: extend
Type: Attributeast.literal: alias
Type: CallAttribute: setdefault
Type: AttributeName: extra_host_conf
Type: NameString: alias
Type: Str
如果您转储您提供的代码片段的 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'])])")
希望对您有所帮助!