我想做一个函数,可以确定如何调用它的源代码。我知道如何使用inspect模块来完成这项工作。例如,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)
的结果?你知道吗
正如@abarnert所说,这可能是不可能的。不过,至少有部分解决办法。你知道吗
获取源代码行并不是最大的问题;像readline这样的模块可以跟踪它们。交互式Python和iPython的代码行公开方式略有不同(sigh),但这也是可以平衡的。(例如,我的show包就是这样做的;它的
linecacher
模块为普通Python和不同的交互风格提供了一个平衡源代码访问的贴面。)更大的问题是,即使有了源代码,
inspect
也不能提供合法的行号(例如,inspect.currentframe().f_back.f_lineno
在普通代码中工作得很好,但在以交互方式调用时会给出1或<stdin>
中的调用点这样的值。)但我还没准备好说这是不可能的。基于交互式Python和iPython生成的回溯,似乎有足够的信息可以重建“这个调用来自哪里?”这需要付出多大的努力,答案会有多有力……这些都是悬而未决的问题。你知道吗
相关问题 更多 >
编程相关推荐