当前位置: 首页 > news >正文

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

Python 语法首先被转换成抽象语法树(Abstract Syntax Tree,AST),然后才被编译成
字节码。这是对源代码抽象语法结构的一种树状表示。利用内置的 ast 模块,可以得到对
Python 语法的处理过程。利用带有 ast.PyCF_ONLY_AST 标记的 compile()函数或者利
用 ast.parse()帮助函数,可以创建 Python 代码的原始 AST。逆向直接转换却没有那么
简单,没有用于完成这项功能的内置函数。不过有些项目(例如 PyPy)可以完成这项任务。
ast 模块提供了一些帮助函数,可以用于处理 AST,如下所示:

tree = ast.parse('def hello_world(): print(“hello world!”)')
tree
<
ast.Module object at 0x00000000038E9588>
ast.dump(tree)
"Module(
body=[
FunctionDef(
name='hello
world’,
args=arguments(
args=[],
vararg=None,
kwonlyargs=[],
kw
defaults=[],
kwarg=None,
defaults=[]
),
body=[
Expr(
value=Call(
func=Name(id=‘print’, ctx=Load()),
args=[Str(s=‘hello world!’)],
keywords=[]
)
)
],
decorator
_list=[],
returns=None
)
]
)"
在上一个例子中,对 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()函数必要的担心,因为不负责任的使用可能会造成真正的灾难。
• 成功的代码生成非常困难,因为它需要对语言特性的深入理解和优异的通用编程技能。
尽管有这些困难,但仍有一些项目成功地应用了这种方法,或者提高了性能,或者实
现了其他方法无法实现的事情。
(1)falcon 的编译路由器
falcon 是一个极简的 Python WSGI Web 框架,用于构建快速又轻量级的 API。它极力
推崇目前在Web上非常流行的REST架构风格。它是对其他大型框架(如Django或Pyramid)
的很好的替代。对于其他致力于精简的微框架(如 Flask、Bottle 和 Web2py)而言,它也
是一个强大的竞争对手。
其特性之一就是非常简单的路由机制。它不像 Django 的 urlconf 提供的路由那样复
杂,也没有提供那么多的功
的,这些路由列表被提供给定义 API 配置的对象。这种方法使路由的速度很快。
思考下面这个非常简短的 API 示例(来自于 falcon 的网上文档):

sample.py

import falcon
import json
class 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.’

http://www.zskr.cn/news/1526405.html

相关文章:

  • 怎么用 AI 预测世界杯:别问冠军是谁,先问概率怎么来
  • 终极Git可视化工具:GitAhead让你的版本控制一目了然
  • 5大核心价值矩阵解析:LinkSwift如何重塑九大网盘下载体验
  • 别再乱选模板了!HR推荐这2个在线简历制作网站,一键套用+真实案例,轻松斩获面试邀约! - HR小张
  • 智能图层革命:如何用AI算法3分钟完成复杂图像的分层重构
  • MH Markets迈汇帮助可靠些吗?
  • 3个痛点,1个方案:轻松解决抖音内容保存难题
  • 解锁Paperless-ngx全球文档管理能力:多语言配置深度解析
  • 技术深度解析:trace.moe 动漫场景向量搜索引擎架构设计与实战应用
  • 告别选择困难症:一张图看懂Activiti5/6/7的核心差异与适用场景
  • 从光线追踪实战看空间划分:手把手用C++实现简易BVH,对比KD-Tree性能差异
  • 膨化食品厂主要分布在哪里?国内主要产区对比
  • PowerPC架构SPR访问与AltiVec向量指令集实战解析
  • 明日方舟终极助手MAA:一键自动化解放你的游戏时间
  • 3步解决ARK模组管理难题:TEKLauncher开源启动器的完整指南
  • 别再只比性能了!UniApp和Flutter在2024年的真实项目落地成本大比拼
  • 2026年苏州律师推荐排行榜:刑事辩护/企业法律顾问/离婚财产分割/建筑工程纠纷/债权债务处置/劳动争议仲裁律师最新权威口碑解析 - 品牌发掘
  • 甲骨文云中国大陆定向 QoS 原理及绕过解决方案
  • 劳务中介服务核心技术拆解:百益人力的实战样本 - 奔跑123
  • 2026年 苏州律师/律师事务所推荐榜单:专业实力与贴心服务深度解析 - 品牌发掘
  • [T.18] 团队项目:Beta 阶段项目展示
  • 2026年6月市场评价好的316L不锈钢工字钢直销厂家哪家专业,316L不锈钢工字钢供应商口碑推荐 - 品牌推荐师
  • 2026年6月安徽GEO优化机构TOP8深度横评:打造企业零踩坑选型路线图 - 936品牌测评网
  • Python 高手编程系列三千三十六 :命名和使用
  • 2026年烟台西服定制/芝罘男士/女士/新郎/企业/商务西服定制推荐榜:匠心剪裁与品质口碑之选 - 品牌发掘
  • BiliRaffle:基于C的B站动态抽奖自动化工具,效率提升38倍的技术实现
  • DeepAgents - Human in the loop
  • AI应用开发:基于知识图谱(Graphify)与 MCP 协议的低成本自主自动化测试方案
  • 【CANdelaStudio-从入门到深入到实战】13 诊断会话控制:为什么ECU需要“多重人格”?
  • 087、GitHub Actions 集成:Pull Request 自动审查、Issue 自动分类与标签管理