2

我有一个使用“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)())

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

4

2 回答 2

1

Python 没有提供很多关于一行中字符偏移的信息。

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

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

进入注释代码:

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

然后执行带注释的代码。

wherecurpos(line,char)记录或打印原始代码中该点的行和字符信息。这将比处理堆栈帧简单得多。

于 2010-05-13T22:38:52.803 回答
0

您当然可以查看字符串中的行,并尝试查找函数名称,但如果它们为函数起别名,则这将不可靠,例如:

bar = foo2
foo1(); foo2()

否则真的很难。覆盖模块执行此操作,Ned在博客文章中解释了特定技术——基本上它涉及重写字节码以将表达式分离为不同的(假)行号。

您实际上可能可以为此使用覆盖模块本身。

于 2010-05-13T21:17:07.307 回答