第二站:把树看清楚

第二站:把树看清楚

顶层是什么、里面那一层是什么、被调用的名字是什么。(被调用的名字在 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

阅读更多 →