【问题标题】:Pushing Python introspection to limits将 Python 内省推向极限
【发布时间】:2017-08-22 10:58:14
【问题描述】:

简单的问题——我可以打印这个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:]

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

【问题讨论】:

  • 我不问你为什么需要这个,但这里有一些基本问题。你在文件或函数中有这个sn-p?它是否是对象的一部分?到目前为止你搜索过吗?您尝试过什么,您的代码有什么问题?
  • 很抱歉这么粗鲁,但我没有做过任何研究,也不打算做任何事情。我也不指望任何人为我做研究。相反,我只是问,以防有人知道答案。如果没有人知道,这不是问题。知道这个问题的答案对我来说并不重要,而且除了简单地在 stackoverflow 上询问之外,我也没有时间自己寻找答案。在其他情况下,我会努力,但我怀疑这甚至不可能,因此我不想浪费时间。
  • 好吧,但是如果您期望得到正确而全面的答案,您的问题需要足够清楚,这就是为什么我的第一个问题是关于您的代码的。此外,我认为在谷歌搜索和阅读比提出问题并等待阳光普照要快;-)。然而,如果你只是想知道它是否可能,答案是肯定的。因为基于 冯诺依曼 的“存储程序计算机”模型,代码也由对象表示。在 python 中访问对象通常是那么容易。
  • 你是在暗示做我想做的事“很容易”?然后给我看:D
  • 这就像给某人一条鱼或教他/她钓鱼。不幸的是,我不是给你鱼的人,也许如果你的问题是一个微不足道的问题,我会这样做,但这是一个有趣的问题,不会轻易出现在每个人的脑海中,这就是为什么我认为提问者应得的不仅仅是一个简单的答案。

标签: python reflection introspection


【解决方案1】:

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

【讨论】:

  • 我想我可以使用基于 Python 的缩进定义块语法的 hack。无需实际解析。
  • @kyrill:这几乎是基于标记化的解决方案,除了你也可以有像单线ifs这样的东西,它不涉及@令牌流中的 987654325@ 和 DEDENT 令牌。把这些做好要困难得多,很难让 AST 解决方案更受欢迎。
【解决方案2】:

是的,这是可行的。以下是您如何做到这一点以及将涉及哪些工具的简要概述:

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

【讨论】:

  • 我有点希望我可以避免第 4 步和第 5 步,但我想这不是一个非常现实的期望。
猜你喜欢
  • 2013-12-11
  • 1970-01-01
  • 2012-05-07
  • 1970-01-01
  • 2015-04-19
  • 1970-01-01
  • 2023-03-30
  • 1970-01-01
  • 2018-10-09
相关资源
最近更新 更多