python-frame
python的源代码编译成PyCodeObject对象之后,就由虚拟机接手整个工作,虚拟机会从PyCodeObject中读取字节码,并在当前上下文中执行。但是PyCodeObject中包含的静态信息,程序执行时的动态信息是不包含的。
程序运行的动态信息是包含在Python的栈帧frame中。
import inspect
from objprint import op
def f():
frame = inspect.currentframe(),
op(
frame,
honor_existing=False,
depth=2
)
f()
"""
<frame 0x2872e94fbe0
.f_back = <frame 0x2872e69d440 ... >, # 上一个frame的指针
.f_builtins = { ... }, # 当前frame对应的内置函数
.f_code = <code 0x2872e73d920 ... >, # code obj
.f_globals = { ... }, # 当前frame眼里的全局变量
.f_lasti = 20, # 上次执行的字节码索引
.f_lineno = 7, # 运行到第几行了
.f_locals = { ... }, # 当前frame眼里的局部变量
.f_trace = None, # 通过sys.settrace设置的trace函数
.f_trace_lines = True, # 每执行一行调用一次f_trace
.f_trace_opcodes = False # 每执行一个字节码调用一次f_trace
>
"""
import inspect
from objprint import op
def f():
frame = inspect.currentframe()
print(frame.f_back.f_lineno) # 那一行调用的f函数
print(frame.f_back.f_locals) #调用该函数的帧的局部变量
print(frame.f_back.f_code.co_name) # 调用该函数的函数名
def g():
a = 1
f()
g()