新闻详情

新闻详情

首页 / 资讯中心 / 详情

Python 高手编程系列三十四:抽象语法

发布时间:2026/9/21 18:25:32来源:尧图网络
Python 高手编程系列三十四:抽象语法
Python 语法首先被转换成抽象语法树Abstract Syntax TreeAST然后才被编译成字节码。这是对源代码抽象语法结构的一种树状表示。利用内置的 ast 模块可以得到对Python 语法的处理过程。利用带有 ast.PyCF_ONLY_AST 标记的 compile()函数或者利用 ast.parse()帮助函数可以创建 Python 代码的原始 AST。逆向直接转换却没有那么简单没有用于完成这项功能的内置函数。不过有些项目例如 PyPy可以完成这项任务。ast 模块提供了一些帮助函数可以用于处理 AST如下所示tree ast.parse(def hello_world(): print(“hello world!”))treeast.Module object at 0x00000000038E9588ast.dump(tree)Module(body[FunctionDef(namehelloworld’,argsarguments(args[],varargNone,kwonlyargs[],kwdefaults[],kwargNone,defaults[]),body[Expr(valueCall(funcName(id‘print’, ctxLoad()),args[Str(s‘hello world!’)],keywords[]))],decorator_list[],returnsNone)])在上一个例子中对 ast.dump()的输出做了重新格式化以提高其可读性并且更好地展示 AST 的树状结构。在传递给 compile()调用之前可以对 AST 进行修改知道这一点很重要。例如新的语法节点可用于额外的测量例如计算测试覆盖率。也可以修改现有代码树以便向现有语法中添加新的语义。MacroPy 项目https://github.com/lihaoyi/macropy就用到了这样的技术利用已经存在的语法向 Python 中添加语法宏也可以用纯人工的方式创建 AST不需要解析任何源代码。这样 Python 程序员就能够为自定义的领域特定语言创建 Python 字节码甚至在 Python VM 之上完全实现另一种现有的编程语言。导入钩子利用 MacroPy 的能力修改原始 AST并不像使用 import macropy.activate 语句那样简单如果它不能以某种方式覆写 Python 的导入行为的话。幸运的是Python 提供了利用两种导入钩子import hook来拦截导入的方法。• 元钩子meta hook它在任何其他 import 处理之前被调用。利用元钩子你可以覆写 sys.path 的处理方式甚至是冻结模块frozen module和内置模块。为了添加新的元钩子必须向 sys.meta_path 列表中添加新的元路径查找器meta path finder对象。• 导入路径钩子import path hook它是作为 sys.path 处理的一部分被调用的。如果遇到了与给定钩子相关联的路径项则使用这种钩子。通过使用新的路径查找器path finder对象扩展 sys.path_hooks 列表来添加导入路径钩子。路径查找器和元路径查找器的实现细节在 Python 官方文档中都有详细说明https://docs.python.org/3/reference/import.html。如果你想要在这个层面上处理导入问题那么官方文档应该是你的首选资料。这是因为 Python 的导入机制相当复杂任何尝试用几个段落进行总结的方法最终不可避免会失败。你可以将本节当作这些可能做法的笔记也可以当作更详细资料的参考。使用代码生成模式的项目很难找到一个真正可用的库的实现它依赖代码生成模式而又不仅是一项实验或简单的概念证明。造成这种情况的原因是显而易见的如下所示。• 对 exec()和 eval()函数必要的担心因为不负责任的使用可能会造成真正的灾难。• 成功的代码生成非常困难因为它需要对语言特性的深入理解和优异的通用编程技能。尽管有这些困难但仍有一些项目成功地应用了这种方法或者提高了性能或者实现了其他方法无法实现的事情。1falcon 的编译路由器falcon 是一个极简的 Python WSGI Web 框架用于构建快速又轻量级的 API。它极力推崇目前在Web上非常流行的REST架构风格。它是对其他大型框架如Django或Pyramid的很好的替代。对于其他致力于精简的微框架如 Flask、Bottle 和 Web2py而言它也是一个强大的竞争对手。其特性之一就是非常简单的路由机制。它不像 Django 的 urlconf 提供的路由那样复杂也没有提供那么多的功能但在大多数情况下对于遵照 REST 架构设计的 API 都是够用的。关于 falcon 的路由最有趣的是实际的路由器是利用路由列表生成的代码来实现的这些路由列表被提供给定义 API 配置的对象。这种方法使路由的速度很快。思考下面这个非常简短的 API 示例来自于 falcon 的网上文档sample.pyimport falconimport jsonclass QuoteResource:def on_get(self, req, resp):“”“Handles GET requests”“”quote {‘quote’: I’ve always been more interested in ’‘the future than in the past.’,‘author’: ‘Grace Hopper’}resp.body json.dumps(quote)api falcon.API()从字符串中生成的每次调用 api.add_route()都会发生如下改变api._router._find. __code __code object find at 0x00000000033C2810, file “”, line 1
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

3分钟看懂好看的手绘图片源码手写实现核心 2026/9/22 11:54:00

3分钟看懂好看的手绘图片源码手写实现核心

3分钟看懂好看的手绘图片源码手写实现核心 官方文档太长抓不住重点,这是很多开发者在看 Canvas 或 SVG 渲染引擎时的真实写照。面对成千上万行代码,我们往往迷失在 API…

阅读更多 →
圆的公式入门到精通:搞定计算性能瓶颈 2026/9/22 11:53:40

圆的公式入门到精通:搞定计算性能瓶颈

圆的公式入门到精通:搞定计算性能瓶颈 别再死记硬背公式了,真正拉开差距的是怎么算得快。 很多开发者对着语法手册点头称是,一到项目里画个图、算个碰撞就卡成 PPT。 今天不聊虚的,直接拆解【圆的公式】在高性能场景下的坑,带你从入门到精通。…

阅读更多 →
3个关键步骤:aso服务性能瓶颈源码解析与实战避坑指南 2026/9/22 11:53:34

3个关键步骤:aso服务性能瓶颈源码解析与实战避坑指南

3个关键步骤:aso服务性能瓶颈源码解析与实战避坑指南 刚把 Python 或 Java 的语法书翻烂,代码能跑通,但一上生产环境就卡死?这就是典型的“学会语法却不知怎么搭项目”。很多开发者在接入 aso服务 时,往往忽略了底层 I/O…

阅读更多 →
3道磁测量高频面试题,搞懂原理不慌 2026/9/22 11:53:34

3道磁测量高频面试题,搞懂原理不慌

3道磁测量高频面试题,搞懂原理不慌 刚拿到新版测试规范,翻开一看,原本熟悉的API调用全变了?别慌,这不是你一个人踩坑。在公路工程的实际作业中,地磁或磁力勘探相关的设备接口经常因为固件升级或标准迭代而变动,导致老代码直接报错。但如果你只盯着…

阅读更多 →
腾讯市值查询系统实战: 3步搞定性能优化与高并发 2026/9/22 11:53:34

腾讯市值查询系统实战: 3步搞定性能优化与高并发

腾讯市值查询系统实战: 3步搞定性能优化与高并发 你是不是也卡在“学会语法却不知怎么搭项目”这一步?看着满屏的 if-else…

阅读更多 →
2026最新太极模块实战:从零搭建项目,解决看教程不会写的难题 2026/9/22 11:53:27

2026最新太极模块实战:从零搭建项目,解决看教程不会写的难题

2026最新太极模块实战:从零搭建项目,解决看教程不会写的难题 看了一堆教程还是不会写项目?这是很多开发者共同的痛点。2026年最新的技术栈变化迅速,但核心逻辑没变。今天不讲虚的,直接拆解一个基于【太极模块】的实战案例。 项目目标与背景…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞