将Python内省推向极限

将Python内省推向极限,python,reflection,introspection,Python,Reflection,Introspection,简单问题–如果,我可以打印此的源代码吗 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

简单问题–如果,我可以打印此
的源代码吗

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.getsource(object)
方法。

可能需要查看
inspect
模块()。具体来说,
inspect.getsource(object)
方法。

是的,这是可行的。下面是一个快速的草图,说明了如何进行此操作以及需要使用哪些工具:

  • 使用检索\u块的调用者的
    print\u source\u的堆栈帧
  • 使用确定调用方的源文件和源文件中的行号
  • 打开源文件
  • 或者
    • 用于分析文件,或
    • 用于标记它
  • 使用抽象语法树或令牌流,确定请求的源块开始和结束的位置
  • 打印块

  • 是的,这是可行的。下面是一个快速的草图,说明了如何进行此操作以及需要使用哪些工具:

  • 使用检索\u块的调用者的
    print\u source\u的堆栈帧
  • 使用确定调用方的源文件和源文件中的行号
  • 打开源文件
  • 或者
    • 用于分析文件,或
    • 用于标记它
  • 使用抽象语法树或令牌流,确定请求的源块开始和结束的位置
  • 打印块

  • 我不想问你为什么需要这个,但这里有一些基本的问题。您在文件或函数中有此代码段吗?它是不是一个物体的一部分?到目前为止你查过了吗?你尝试过什么?你的代码有什么问题?抱歉这么粗鲁,但我没有做任何研究,也不打算做任何研究。我也不希望有人为我做研究。我只是问,万一有人知道答案。如果没有人知道,这不是问题。知道这个问题的答案对我来说并不重要,我也没有时间独自寻找答案,而不是简单地问问题。在其他情况下,我会努力,但我怀疑这是不可能的,因此我不想浪费时间。好吧,没关系,但如果你希望得到正确和全面的答案,你需要在你的问题上足够清楚,这就是为什么我的第一个问题是关于你的代码。另外,我认为在谷歌上搜索和阅读比问一个问题和等待阳光普照要快得多;-)。然而,如果你只是想知道这是否可能,答案是肯定的。因为基于冯·诺依曼的“存储程序计算机”模型,代码也由对象表示。在python中访问对象通常很容易。你是说做我想做的事情“很容易”吗?然后告诉我:这就像给某人一条鱼或教他/她钓鱼。不幸的是,我不是给你答案的人,也许如果你的问题很琐碎,我会这么做,但这是一个有趣的问题,并不是每个人都能轻易想到的,这就是为什么我认为提问者应该得到的不仅仅是一个简单的答案。我不想问你为什么需要这个,但这里有一些基本的问题。您在文件或函数中有此代码段吗?它是不是一个物体的一部分?到目前为止你查过了吗?你尝试过什么?你的代码有什么问题?抱歉这么粗鲁,但我没有做任何研究,也不打算做任何研究。我也不希望有人为我做研究。我只是问,万一有人知道答案。如果没有人知道,这不是问题。知道这个问题的答案对我来说并不重要,我也没有时间独自寻找答案,而不是简单地问问题。在其他情况下,我会努力,但我怀疑这是不可能的,因此我不想浪费时间。好吧,没关系,但如果你希望得到正确和全面的答案,你需要在你的问题上足够清楚,这就是为什么我的第一个问题是关于你的代码。另外,我认为在谷歌上搜索和阅读比问一个问题和等待阳光普照要快得多;-)。然而,如果你只是想知道这是否可能,答案是肯定的。因为基于冯·诺依曼的“存储程序计算机”模型,代码也由对象表示。在python中访问对象通常很容易。你是说做我想做的事情“很容易”吗?然后告诉我:这就像给某人一条鱼或教他/她钓鱼。不幸的是,我不是给你答案的人,也许如果你的问题很琐碎,我会这么做,但这是一个有趣的问题,不容易出现在每个人的脑海中,这就是为什么我认为提问者应该得到的不仅仅是一个简单的答案。我有点希望我可以避免第4步和第5步,但我想这不是一个非常现实的期望。我有点希望我可以避免第4步和第5步,但我想这不是一个非常现实的期望。我想我可以使用基于Python缩进定义的块语法的hack。无需实际解析。@Kyril:这几乎就是基于标记化的解决方案,只是您也可以使用类似于一行
    if
    s的东西,它不涉及标记流中的
    INDENT
    DEDENT
    标记。要正确处理这些问题要困难得多,要使AST解决方案更受欢迎就足够困难了。我想我可以使用一种基于Python缩进定义的块语法的方法。无需实际解析。@Kyril:这几乎就是基于标记化的解决方案,只是您也可以使用类似于一行
    if
    s的东西,它不涉及标记流中的
    INDENT
    DEDENT
    标记。它是