第二站:把树看清楚
顶层是什么、里面那一层是什么、被调用的名字是什么。(被调用的名字在 t.body[0].value.func.id。)
阅读更多 →
第一站:把词切出来
把 print("hi") 切成的词一个个列出来。
阅读更多 →
⚠️ 最后一站:真的跑一次
把编译好的那个 code 对象真的执行一次: import ast, io, tokenize LINE = 'print("hi")' def toks(sr
阅读更多 →
一行代码的四站产物
print("hi") 走完四站,各站留下什么:词数、树里那次调用的类型、编译期记下的名字、常量表第一项。 import ast, io, tokenize LINE =
阅读更多 →
⚠️ 哪一站的产物里已经没有源码文本了
顺着流水线走,从哪一站开始,产物里就找不到源码原文了?答案是【0】。
阅读更多 →
追踪一行代码,该按什么顺序看
要弄清一行代码是怎么跑起来的,最有效的看法是【0】。
阅读更多 →
这个函数的「形状」,编译期就定了
同一个函数,把三个数取出来:参数个数、局部名个数、要往外找的名字个数。
阅读更多 →
🔴 两份名单,编译期就分好了
一个小函数: G = 10 def f(a): b = a + 1 return b + G + len(str(b)) 把编译产物里的局部名单和要往外找的名单各打出来。
阅读更多 →
自己写:两边常量表里最大的数
两段源码,一段全是常量、一段掺了变量。各自常量表里最大的那一项是多少?
阅读更多 →
⚠️ 换成有变量参与,就折不动了
换一段:y = x + 0。这次算式里有个变量。常量表变成什么? def consts(src): """编译一段源码,把它的常量表取出来(None 不算)&qu
阅读更多 →