[ python骨架frame ]


相当于当前运行时的帧。

源代码

import inspect
from objprint import op

def f():
    frame = inspect.currentframe(),
    op(frame, honor_existing=False, depth=2)

f()

输出out

(
  <frame 0x23376b59f00
    .f_back = <frame 0x23376c45580 ... >,  # 调用他的frame是谁 就是上一个人
    .f_builtins = { ... },   # 当前frame对应的内置函数
    .f_code = <code 0x23376c29ac0 ... >,  # code object里面的内容,变量名字, 字节码 ...
    .f_globals = { ... },  #  当前函数眼里的全局变量
    .f_lasti = 62,  # 上一个frame代码里面运行到第几行了
    .f_lineno = 6,   # 当前frame代码运行到第几行
    .f_locals = { ... },  # 当前函数所有局部变量的值
    .f_trace = None,    # 这里是设置的钩子函数, 可以在每一次运行字节码,或者每一行程序代码的时候,执行的回调, 例如python的 debug pdb。可以通过sys.settrace设置
    .f_trace_lines = True, # 每一行trigger一下函数
    .f_trace_opcodes = False  # 每一个字节码trigger一下这个函数
  >
)

例子1

获取调用我这个函数的名字的文件路径 获取调用我这个函数是第几行

import inspect

def f():
    frame = inspect.currentframe()

    print(frame.f_back.f_code.co_filename)
    print(frame.f_back.f_lineno)

def g():
    f()  

f()