如何从交互式sh接入呼叫源线

2024-04-24 22:15:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我想做一个函数,可以确定如何调用它的源代码。我知道如何使用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)的结果?你知道吗


Tags: 模块函数namenonenumberhelloindex源代码
1条回答
网友
1楼 · 发布于 2024-04-24 22:15:56

正如@abarnert所说,这可能是不可能的。不过,至少有部分解决办法。你知道吗

获取源代码行并不是最大的问题;像readline这样的模块可以跟踪它们。交互式Python和iPython的代码行公开方式略有不同(sigh),但这也是可以平衡的。(例如,我的show包就是这样做的;它的linecacher模块为普通Python和不同的交互风格提供了一个平衡源代码访问的贴面。)

更大的问题是,即使有了源代码,inspect也不能提供合法的行号(例如,inspect.currentframe().f_back.f_lineno在普通代码中工作得很好,但在以交互方式调用时会给出1或<stdin>中的调用点这样的值。)

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

相关问题 更多 >