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()
posted @ 2022-08-05 21:59  店里最会撒谎白玉汤  阅读(168)  评论(0)    收藏  举报