看一个真函数的代码对象
(Python 自己就是「编译成字节码、由 VM 执行」:dis.get_instructions(f) 列出函数 f 的指令,每条有 opname(指令名)和 argval(操作数);f.__code__ 是代码对象,co_varnames 是局部变量名、co_argcount 参数个数、co_names 用到的全局名。不同 Python 版本的指令名会变,本节只看这些稳定的东西。)
看 f 的局部变量、参数个数、全局名,和它有没有比较、有没有跳转:
import dis
def f(a, b):
x = a + b * 2
if x > 10:
return x
y = x - 1
return y
ins = list(dis.get_instructions(f))
co = f.__code__
print(str(co.co_varnames).replace(" ", "") + "/" + str(co.co_argcount) + "/" + str(any("JUMP" in i.opname for i in ins)) + "/" + str(any(i.opname == "COMPARE_OP" for i in ins)) + "/" + str([i.argval for i in ins if i.opname == "STORE_FAST"]).replace(" ", ""))
全部评论