1

我想做一个函数来确定它是如何被调用的源代码。我知道通常如何使用检查模块执行此操作。例如,这个问题运行良好,并在变量中提供了我想要的输出,lines如下所示:

def hello(x):
   frame,filename,line_number,function_name,lines,index=\
       inspect.getouterframes(inspect.currentframe())[1]
   print(frame,filename,line_number,function_name,lines,index)

问题是这个解决方案在交互式命令行会话中不起作用。例如,在命令行中,结果如下所示:

>>> y = hello(7)
(<frame object at 0x01ECA9E8>, '<stdin>', 1, '<module>', None, None)

问题是源文件是'<stdin>',所以lines变量是None。如何y = hello(7)在交互式会话期间访问调用线路以查找包含字符串的结果?

4

1 回答 1

2

正如@abarnert所说,这可能是不可能的。但是,至少有部分解决方法。

获取源代码行不是最大的问题。像readline这样的模块会跟踪它们。交互式 Python 和 iPython 显示它们的线条略有不同(叹气),但这也可以均衡。(例如,我的showlinecacher包就是这样做的;它的模块为普通 Python 和不同的交互式风格提供了均衡的源代码访问。)

更大的问题是,即使您拥有源代码,inspect也不提供合法的行号(例如inspect.currentframe().f_back.f_lineno,在普通代码中效果很好,但在<stdin>交互调用时会给出类似 1 或调用点的值。)

但我还没有准备好说这是不可能的。根据交互式 Python 和 iPython 生成的回溯,似乎有足够的信息可用于重建“这个调用来自哪里?” 这需要付出多少努力,答案会有多强大……这些都是悬而未决的问题。

于 2012-11-14T21:43:21.233 回答