Ast解析Python代码示例

# -*- coding: utf-8 -*-
# @Desc    : Ast代码解析示例
import ast


class CodeParse():
    def __init__(self):
        self.visited_nodes = set()

    # 解析装饰器
    def parse_decorator(self, decorator):
        return ast.dump(decorator)

    # 解析函数
    def parse_func(self, node, step=''):
    	# 可能存在id重复而解析遗漏问题,实际中不建议使用id作存在性判断依据
        if id(node) in self.visited_nodes:
            return
        self.visited_nodes.add(id(node))

        if not hasattr(node, 'name'):
            return

        print('{}{}'.format(step, node.name))

        if hasattr(node, 'decorator_list'):
            # 装饰器
            for decorator in node.__getattribute__('decorator_list'):
                self.parse_decorator(decorator)

        if hasattr(node, 'body'):
            # 内部函数
            for body in node.__getattribute__('body'):
                self.parse_func(body, step + '\t')

    # 解析类
    def parse_class(self, node):
    	# 可能存在id重复而解析遗漏问题,实际中不建议使用id作存在性判断依据
        if id(node) in self.visited_nodes:
            return
        self.visited_nodes.add(id(node))

        if hasattr(node, 'bases'):
            # 父类
            base_names = []
            for base in node.__getattribute__("bases"):
                base_names.append(base.id)

        print('{}({}):'.format(node.name, ', '.join(base_names)))

        if hasattr(node, 'decorator_list'):
            # 装饰器
            for decorator in node.__getattribute__('decorator_list'):
                self.parse_decorator(decorator)

        if hasattr(node, 'body'):
            # 类方法
            for body in node.__getattribute__('body'):
                self.parse_func(body, step='\t')

    # 解析py代码
    def parse_py_code(self, file_path):
        with open(file_path, 'r', encoding='utf8') as fr:
            py_code = fr.read()

        tree = ast.parse(py_code)
        for node in ast.walk(tree):
            if isinstance(node, ast.ClassDef):
                # 解析类
                self.parse_class(node)
            if isinstance(node, ast.FunctionDef):
                # 解析函数
                self.parse_func(node)


if __name__ == '__main__':
    CodeParse().parse_py_code('demo.py')

你可能感兴趣的:(python,开发语言)