欢迎访问宙启技术站
智能推送

如何使用_ast模块在python中提取代码中的函数和类的信息

发布时间:2023-12-28 03:14:17

在Python中,可以使用_ast模块来解析抽象语法树(Abstract Syntax Tree)。抽象语法树是Python代码的表示形式,可以用来分析和提取代码中的函数和类的信息。下面是如何使用_ast模块来提取函数和类的信息的示例。

首先,需要导入_ast模块:

import _ast

然后,可以使用_ast模块中的类和函数来获取代码中的函数和类信息。我们先来看一个简单的示例,假设我们有以下的Python代码:

def add(x, y):
    return x + y

class Point:
    def __init__(self, x, y):
        self.x = x
        self.y = y

要提取以上代码中的函数和类信息,我们可以使用如下的代码:

tree = compile(source_code, filename, mode, _ast.PyCF_ONLY_AST)

其中,source_code是代码的字符串,filename是文件名,mode是字符串表示的代码的模式。_ast.PyCF_ONLY_AST表示只生成抽象语法树。

在上面的示例中,source_code应该是包含了上述代码的字符串,比如:

source_code = '''
def add(x, y):
    return x + y

class Point:
    def __init__(self, x, y):
        self.x = x
        self.y = y
'''

生成抽象语法树之后,可以使用walk()函数来遍历抽象语法树的节点:

def get_functions_and_classes(tree):
    functions = []
    classes = []

    for node in _ast.walk(tree):
        if isinstance(node, _ast.FunctionDef):
            functions.append(node)
        elif isinstance(node, _ast.ClassDef):
            classes.append(node)

    return functions, classes

functions, classes = get_functions_and_classes(tree)

在上述示例中,我们定义了一个get_functions_and_classes()函数,它接受一个抽象语法树作为参数,然后遍历抽象语法树的节点。如果节点是一个函数定义(_ast.FunctionDef),则将其添加到functions列表中;如果节点是一个类定义(_ast.ClassDef),则将其添加到classes列表中。

最后,可以打印出这些函数和类的信息:

for function in functions:
    print("Function name:", function.name)
    print("Arguments:", [arg.arg for arg in function.args.args])
    print()

for class_ in classes:
    print("Class name:", class_.name)
    print("Methods:", [method.name for method in class_.body if isinstance(method, _ast.FunctionDef)])
    print()

在上述示例中,我们通过function.nameclass_.name来获取函数和类的名称。对于函数,我们还可以通过function.args.args来获取参数列表,利用列表推导式[arg.arg for arg in function.args.args]将参数列表转化为一个字符串列表。

对于类,我们可以通过class_.body来获取类的方法列表,并使用列表推导式[method.name for method in class_.body if isinstance(method, _ast.FunctionDef)]将方法列表转化为一个字符串列表。

以上就是使用_ast模块在Python中提取代码中的函数和类信息的方法和示例。