将 Python 内省推向极限

Pushing Python introspection to limits

简单的问题 – 我可以打印这个 if 的源代码吗?

if __name__ == '__main__':
  # ...
  # this is the `if` I want to print
  #  V 
  if args and args[0][0] == '-':
    if args[0] in ('--help','-h','-?'):
      print_source_of_block(level=2)
    icase = 'i' in args[0]
    desc = 'd' in args[0]
    args = args[1:]

请不要问我为什么需要它,也不要给我建议如何编写用户帮助。因为好奇所以想知道

可能需要查看 inspect 模块 (https://docs.python.org/2/library/inspect.html)。具体来说,inspect.getsource(object) 方法。

是的,这是可行的。以下是如何执行此操作以及将涉及哪些工具的简要说明:

  1. 检索 print_source_of_block 的调用者 inspect.currentframe().f_back 的堆栈帧。
  2. 使用inspect.getframeinfo确定调用者的源文件和该源文件中的行号。
  3. 打开源文件。
  4. 要么
  5. 使用抽象语法树或令牌流,确定请求的源块的开始和结束位置。
  6. 打印块。