我想创建一个可以确定调用方式的源代码的函数。我知道如何使用检查模块进行此操作。例如,this question效果很好,并在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)
的结果?
答案 0 :(得分:2)
正如@abarnert所述,这可能是不可能的。但是,至少有部分解决方法。
获取源代码行不是最大的问题;像readline这样的模块会跟踪它们。交互式Python和iPython以不同的方式暴露他们的行(叹息),但也可以均衡。 (例如,我的show包执行此操作;其linecacher
模块放置一个胶合代码以均衡普通Python的源访问和不同的交互式风格。)
更大的问题是,即使您拥有源代码,inspect
也不会提供合法的行号(例如inspect.currentframe().f_back.f_lineno
在普通代码中效果很好,但会提供类似1或点的值交互式调用时<stdin>
中的调用。)
但我还没准备好把它称之为不可能。基于交互式Python和iPython生成的回溯,似乎有足够的信息可用于重建“此调用来自何处?”需要多少努力,以及答案的稳健程度......这些都是悬而未决的问题。