Skip to main content
 首页 » 编程设计

python之在运行时识别 python 脚本行中的函数调用

2025年05月04日6三少

我有一个使用“exec”运行的 python 脚本。 当脚本调用一个函数时,我希望它知道该调用的行号和偏移量。

这是一个例子。如果我的脚本是:

foo1(); foo2(); foo1() 
foo3() 

如果我有在每个函数中打印 (line,offset) 的代码,我应该得到

(0,0), (0,8), (0,16), (1,0) 

在大多数情况下,这可以通过获取堆栈帧轻松完成,因为它包含行号和函数名称。唯一的问题是在某一行中有两个同名的函数。不幸的是,这对我来说很常见。有什么想法吗?


好吧,看来改原码是最简单的办法。

你会如何解决类似的问题

if foo1(7) or foo1(6): 

或

foo2(foo1(), foo1()) 

对此有一些不太优雅的解决方案,比如自动将前面的例子转为:

def curpos(pos, func): 
  record_curpos(pos) 
  return func 
 
curpos(foo2,0)(curpos(foo1,5)(), curpos(foo1,13)()) 

如果您有更简单的想法,请告诉我。

请您参考如下方法:

Python 不提供大量有关行中字符偏移的信息。

如果您使用 exec 来执行 Python,那么您可以在执行代码之前机械地重写代码以告诉您您想知道的内容。例如,您可以更改原始代码:

foo1(); foo2(); foo1() 
foo3() 

注释代码:

curpos(1,0); foo1(); curpos(1,8); foo2(); curpos(1,16); foo1() 
curpos(2,0); foo3() 

然后执行注释代码。

其中curpos(line,char)记录或打印了原代码中该点的行和字符信息。这比处理堆栈框架要简单得多。