
你有没有遇到过这种情况:代码明明能跑,但你就是搞不明白 Python 到底是怎么"读"你写的这串东西的?
比如你写了一个套了好几层的 f-string,或者一个长得离谱的推导式,运行结果对是对了,可你心里没底——这个变量名到底被当成了什么?那个运算符先算还是后算?
这时候稍微有点经验的人会跟你说:去看看 ast 啊。
ast 是 Python 的"抽象语法树"。简单说,Python 在真正运行你的代码之前,会先在脑子里把代码拆成一棵"树"——哪句是赋值、哪句是调用、哪个是字符串、哪个是名字,全都清清楚楚。看懂这棵树,你就看懂了 Python 是怎么理解你的代码的。
可问题来了:过去你让 Python 把这棵树打印出来,它吐给你的,是一坨没有颜色、没有缩进、全是括号和逗号的黑白字。看着就头晕。
好在 Python 3.15 给 ast 上了色。这事儿,对新手意外地友好。
一、先认识一下:ast 到底能帮你干啥
其实 ast 离新手一点都不远。它就像给代码拍了一张 X 光片,骨架结构一目了然。你不用去写什么编译器,光是"看一眼 Python 怎么理解你的代码",就能解决一堆困惑。
最简单的用法就是 ast.parse 加 ast.dump:
import ast
tree = ast.parse("print('hello')")
print(ast.dump(tree))
运行之后,你会看到一棵树的文本描述:Module 下面挂着 Expr,Expr 下面挂着 Call,Call 的 func 是 Name(id='print')……这就是 Python 眼里 print('hello') 的样子。
新手在什么时候最需要它?比如你写了个嵌套字典推导式,结果和你预期不一样,你就想确认一下:到底是我写的顺序问题,还是 Python 压根就不是按我想的那样解析的?把代码 parse 出来 dump 一下,一眼就能看出结构。
举个例子,你写了 x = [i * 2 for i in range(3)],心里想确认它到底是不是被当成了一个列表推导式。dump 一下看看:
import ast
tree = ast.parse("x = [i * 2 for i in range(3)]")
print(ast.dump(tree, indent=2))
你会看到最外层是 Assign,等号右边是 ListComp,里面挂着 generator 和元素 i * 2 的 BinOp。这种树状关系一旦看明白,你以后写任何复杂表达式,脑子里都会自动长出一棵树,再也不会被括号绕晕。
二、老版本的 ast.dump:一坨让人头晕的黑白字
但说实话,3.15 之前,看 dump 的输出挺折磨人的。
它默认把所有节点挤在一行里,括号套括号,逗号连逗号。稍微复杂点的代码,dump 出来能绕屏幕三圈。你得像找迷宫出口一样,从左括号数到右括号,才能搞清楚哪个节点套着哪个。
更惨的是,全都是同一种灰色。Name、Constant、运算符、字符串……长得一模一样,全靠你自己的眼睛去分辨。新手第一次看,十个有九个直接关掉窗口。
这也是为什么很多人觉得 ast "太高深、离自己太远"——不是它难,是它输出得太不友好了。
我当年第一次用 ast,看着那坨括号直接劝退,直到半年后才重新鼓起勇气学。如果当时就有 3.15 这种带颜色、带缩进的输出,我大概能少走两个月弯路。所以这次更新,我是真觉得对新手友好。
三、改动一:ast.dump 多了个 color 参数
Python 3.15 给 ast.dump 加了一个 color 参数。
用法特别简单:
import ast
tree = ast.parse("print('hello')")
print(ast.dump(tree, indent=4, color=True))
就多了 color=True 这么一个开关。打开之后,dump 出来的树会用 ANSI 颜色把不同类型高亮出来——节点名一种颜色,字段名一种颜色,字符串值一种颜色。再配合 indent=4 让树一层层缩进开,整棵结构清清楚楚,跟看一份带语法高亮的代码似的。
颜色到底怎么帮到你?以前你看 dump,得靠数括号、看缩进来判断层级;现在不同类型的节点直接上了不同的颜色——函数是蓝的、字符串是绿的、运算符又是一种色。你的眼睛不用再去做括号配对这种苦力活,扫一眼就懂哪块套哪块。
这里有个细节特别贴心:color 默认是 False。也就是说,你不主动开,它就还是老样子。为什么要这样设计?因为颜色是靠 ANSI 转义码实现的,如果你把带颜色的输出写进文件、写进日志、或者发给别人,对方看到的就是一堆乱码符号。所以 Python 把"默认不染色"作为安全选择——想看颜色你主动开,想存干净文本你就不开。颜色还能用环境变量统一控制,跟 Python 3.15 其他的"上色"功能(比如报错信息、difflib)是一套逻辑。
四、改动二:python -m ast 默认就高亮
第二个改动更省事:你甚至不用写代码,直接在命令行敲一行就能看。
python -m ast hello.py
在 Python 3.15 里,这条命令的输出默认就是语法高亮的。你手头有个 .py 文件,想快速瞄一眼 Python 是怎么解析它的,直接这么跑一下,屏幕上就是彩色的结构。
它还有几个实用的小开关:
什么时候用命令行、什么时候写代码?如果你只是想透视一整个文件,或者临时看一眼某个脚本的结构,直接 python -m ast 最方便;如果你要在自己的程序里分析代码(比如写个小工具检查命名规范),那就用 ast.parse 配合 ast.dump(color=True) 在终端里看。
python -m ast -a hello.py
python -m ast -i 4 hello.py
-a 会把行号、列偏移这些位置信息也打印出来,方便你精确定位到源码的某一行;-i 4 则是按 4 个空格一层来缩进,树状结构更直观。对着一个看不懂的文件,先用这条命令"透视"一下,往往比盯着源码硬读要快得多。
五、新手能用它干点啥:3 个实在的场景
别觉得 ast 是编译器工程师的专利,下面这三个场景,新手天天能碰到。
第一,看不懂报错的时候。有些报错信息会说"在第 5 行附近有语法问题",但你盯着第 5 行看半天也没看出毛病。这时候把那段代码 parse 一下,看 Python 实际把它拆成了什么结构,经常能恍然大悟:哦,原来它把这里当成别的东西了。
第二,写复杂表达式的时候。比如你写了 a if b else c if d else e 这种嵌套三元,自己都快忘了优先级,dump 一下立刻看到是嵌套的 IfExp,谁套谁一清二楚。推导式、嵌套的 f-string、一长串的运算,只要不确定 Python 的解析顺序对不对,dump 出来看一眼结构,比靠猜靠谱一百倍。
第三,建立"代码是一棵树"的直觉。这是最重要的。很多新手学 Python 很久,还是把代码当成"一行行从上往下执行的文字"。一旦你习惯用 ast 的视角看代码,你会突然明白:为什么有些写法会报语法错、为什么某些东西能当字典的键、为什么缩进这么重要。这种底层直觉,能让你少走特别多弯路。
六、一个容易踩的坑
最后提醒一句:color=True 输出的内容里带了 ANSI 转义码。
# 错误示范:把带颜色的输出写进文件
with open("tree.txt", "w") as f:
f.write(ast.dump(tree, color=True))
这样写进 tree.txt 的,不是干净的文字,而是一堆颜色控制码,用普通记事本打开全是乱码。如果你的目的是保存一份能看的文本,就老老实实保持 color=False(也就是不写这个参数)。还有个小前提:你的终端得支持 ANSI 颜色。现在主流终端基本都支持,VS Code 内置终端、Windows Terminal、Mac 的 Terminal 都没问题;但老旧的 Windows 命令提示符(cmd)可能显示不出颜色,只会看到原始转义码。遇到这种情况,换个省事儿的终端就好。
颜色只用在"你亲自盯着终端看"的场景,别往文件里塞。
你有没有过那种"代码能跑,但就是搞不懂它怎么跑的"时刻?或者你第一次见到 ast 的时候,是什么感觉?
以上就是“Python 3.15 ast 这2个上色改动救了多少新手?”的详细内容,想要了解更多Python教程欢迎持续关注编程学习网。
扫码二维码 获取免费视频学习资料

- 本文固定链接: http://www.phpxs.com/post/14315/
- 转载请注明:转载必须在正文中标注并保留原文链接
- 扫码: 扫上方二维码获取免费视频资料