编程学习网 > 编程语言 > Python > Python 3.15 ast 这2个上色改动救了多少新手?
2026
07-14

Python 3.15 ast 这2个上色改动救了多少新手?


你有没有遇到过这种情况:代码明明能跑,但你就是搞不明白 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 下面挂着 ExprExpr 下面挂着 CallCall 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 出来能绕屏幕三圈。你得像找迷宫出口一样,从左括号数到右括号,才能搞清楚哪个节点套着哪个。

更惨的是,全都是同一种灰色。NameConstant、运算符、字符串……长得一模一样,全靠你自己的眼睛去分辨。新手第一次看,十个有九个直接关掉窗口。

这也是为什么很多人觉得 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 TerminalMac Terminal 都没问题;但老旧的 Windows 命令提示符(cmd)可能显示不出颜色,只会看到原始转义码。遇到这种情况,换个省事儿的终端就好。

颜色只用在"你亲自盯着终端看"的场景,别往文件里塞。

你有没有过那种"代码能跑,但就是搞不懂它怎么跑的"时刻?或者你第一次见到 ast 的时候,是什么感觉?

以上就是“Python 3.15 ast 这2个上色改动救了多少新手?的详细内容,想要了解更多Python教程欢迎持续关注编程学习网。  

扫码二维码 获取免费视频学习资料

Python编程学习

查 看2022高级编程视频教程免费获取