Python Ast抽象语法树怎么应用


本篇内容主要讲解“PythonAst抽象语法树怎么应用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“PythonAst抽象语法树怎么应用”吧!Abstract Syntax Trees即抽象语法树。Ast是python源码到字节码的一种中间产物,借助ast模块可以从语法树的角度分析源码结构。此外,我们不仅可以修改和执行语法树,还可以将Source生成的语法树unparse成python源码。因此ast给python源码检查、语法分析、修改代码以及代码调试等留下了足够的发挥空间。Python官方提供的CPython解释器对python源码的处理过程如下:Parse source code into a parse tree (Parser/pgen.c)Transform parse tree into an Abstract Syntax Tree (Python/ast.c)Transform AST into a Control Flow Graph (Python/compile.c)Emit bytecode based on the Control Flow Graph (Python/compile.c)即实际python代码的处理过程如下:源代码解析 –> 语法树 –> 抽象语法树(AST) –>控制流程图 –> 字节码上述过程在python2.5之后被应用。python源码首先被解析成语法树,随后又转换成抽象语法树。在抽象语法树中我们可以看到源码文件中的python的语法结构。大部分时间编程可能都不需要用到抽象语法树,但是在特定的条件和需求的情况下,AST又有其特殊的方便性。下面是一个抽象语法的简单实例。先简单了解一下compile函数。compile(source, filename, mode[, flags[, dont_inherit]])source — 字符串或者AST(Abstract Syntax Trees)对象。一般可将整个py文件内容file.read()传入。filename — 代码文件名称,如果不是从文件读取代码则传递一些可辨认的值。mode — 指定编译代码的种类。可以指定为 exec, eval, single。fl免费云主机域名ags — 变量作用域,局部命名空间,如果被提供,可以是任何映射对象。flags和dont_inherit是用来控制编译源码时的标志。使用Compile编译并执行:上面func_def经过compile编译得到字节码,cm即code对象,True == isinstance(cm, types.CodeType)。compile(source, filename, mode, ast.PyCF_ONLY_AST) ast.parse(source, filename=’‘, mode=’exec’)使用上面的func_def生成ast.下面是func_def对应的ast结构:除了ast.dump,有很多dump ast的第三方库,如astunparse, codegen, unparse等。这些第三方库不仅能够以更好的方式展示出ast结构,还能够将ast反向导出python source代码。上面是部分摘自官网的Abstract Grammar,实际遍历ast Node过程中根据Node的类型访问其属性。python提供了两种方式来遍历整个抽象语法树。将func_def中的add函数中的加法运算改为减法,同时为函数实现添加调用日志。运行结果:使用NodeVisitor主要是通过修改语法树上节点的方式改变AST结构,NodeTransformer主要是替换ast中的节点。既然func_def中定义的add已经被改成一个减函数了,那么我们就彻底一点,把函数名和参数以及被调用的函数都在ast中改掉,并且将添加的函数调用log写的更加复杂一些,争取改的面目全非:-)结果:代码中能够清楚的看到两者的区别。这里不再赘述。AST模块实际编程中很少用到,但是作为一种源代码辅助检查手段是非常有意义的;语法检查,调试错误,特殊字段检测等。上面通过为函数添加调用日志的信息是一种调试python源代码的一种方式,不过实际中我们是通过parse整个python文件的方式遍历修改源码。下面是中日韩字符的unicode编码范围CJK Unified IdeographsRange:4E00—9FFFNumber of characters:20992Languages:chinese, japanese, korean, vietnamese使用 unicode 范围u4e00 – u9fff来判别汉字,注意这个范围并不包含中文字符(e.g.u’;’ ==u’uff1b’).下面是一个判断字符串中是否包含中文字符的一个类CNCheckHelper:接口is_any_chinese有两种判断模式,严格检测只要包含中文字符串就可以检查出,非严格必须全部包含中文。下面我们利用ast来遍历源文件的抽象语法树,并检测其中字符串是否包含中文字符。上面这个例子比较的简单,但大概就是这个意思。关于CPython解释器执行源码的过程可以参考官网描述:PEP 339一个函数中定义的函数或者lambda中引用了父函数中的local variable,并且当做返回值返回。特定场景下闭包是非常有用的,但是也很容易被误用。关于python闭包的概念可以参考我的另一篇文章:理解Python闭包概念这里简单介绍一下如何借助ast来检测lambda中闭包的引用。代码如下:遍历工程文件:由于Lambda(arguments args, expr body)中的body expression可能非常复杂,上面的例子中仅仅处理了比较简单的body expr。可根据自己工程特点修改和扩展检查规则。为了更加一般化可以单独写一个visitor类来遍历lambda节点。到此,相信大家对“PythonAst抽象语法树怎么应用”有了更深的了解,不妨来实际操作一番吧!这里是百云主机网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

相关推荐: 如何用vue实现组件间参数传递

这篇文章主要介绍“如何用vue实现组件间参数传递”,在日常操作中,相信很多人在如何用vue实现组件间参数传递问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何用vue实现组件间参数传递”的疑惑有所帮助!接下来,请跟着小编一起来学…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

(0)
打赏 微信扫一扫 微信扫一扫
上一篇 03/25 14:22
下一篇 03/25 14:22

相关推荐