蟒蛇内省;查看调用了哪个方法,谁调用了它,以及从main方法传递了哪些参数

时间:2014-05-05 21:49:36

标签: python python-3.x

以下是我在python中对“模拟操作系统”进行内省时的尝试。

def tracefunc(frame, event, arg, indent=[0]):
  if event == "call" and frame.f_code.co_name in methods:
    if frame.f_code.co_name != 'FetchOperand':
      print("====================================")
      print("CALL FUNCTION: %s()\nARGUMENTS: %s" % (frame.f_code.co_name, frame.f_code.co_varnames))
      print('====================================')
  return tracefunc
sys.settrace(tracefunc)

它包含在一个看起来像这样的块中:

if __name__ == '__main__':
  vm = OS()
  while(interrupt not shutdown):
    try:
      vm.read_interrupt()
      vm.execute_program()
      # some case statement

最终目标是打印出在我的VM对象中封装的任何方法的执行。我想知道它的调用位置,调用者,传入的参数是什么,以及它本身修改了什么变量。我还需要一种方法来指定这些名为output parameters的东西,这将是一个列表。理想情况下,如果它修改了一个数组,它将打印索引和项目以及该索引。这是一个例子

$my_program: 4

==============================
SYSTEM CALL() method called
called by READ INTERRUPT()

--> Arguments:
  arg[0]: 4 <type 'int'>

--> Output Parameters:
  gpr[0]: OK

return value: 'OK'

==============================
PUT CHARACTER() method called
called by SYSTEM CALL()

--> Arguments:
  None

--> output parameters:
  gpr[0]: OK
  gpr[1]: 3

--> modified variables:
memory:
  index: 4003
  old value: 0
  new value: 3

return value: 'OK'
==============================
顺便说一下,不要觉得我原来的做事方式太束缚了。我欢迎你提出任何建议。

有人能建议一种实现这种内省的方法吗?

1 个答案:

答案 0 :(得分:0)

import traceback
traceback.print_stack()
那应该告诉你所有伟大的事情......