如何在 Python 代码中找到列数

8 浏览
0 Comments

如何在 Python 代码中找到列数

简短问题:在此处提到可以找到函数调用时的行号。

同样,我如何找到列号?

长问题:

def col():
  return something
print("result", col(), col(), col())

每次调用该打印函数都应返回不同的数字,但相同的数字。

我该如何做到这一点?

编辑:

我的解决方法如下:

import inspect
def cid():
  f = inspect.currentframe().f_back
  caller_id = (f.f_lineno, f.f_lasti)
  return caller_id
print((cid(), cid(), cid(), cid(), cid()))
print((cid(), cid(), cid(), cid(), cid()))
print((cid(), cid(), cid(), cid(), cid()))
print((cid(), cid(), cid(), cid(), cid()))
print((cid(),
        cid(),
        cid(),
        cid(),
        cid()))

预期的工作情况(目前为止)。 这将打印:

((8, 30), (8, 36), (8, 42), (8, 48), (8, 54))
((9, 65), (9, 71), (9, 77), (9, 83), (9, 89))
((10, 100), (10, 106), (10, 112), (10, 118), (10, 124))
((11, 135), (11, 141), (11, 147), (11, 153), (11, 159))
((13, 170), (14, 176), (15, 182), (16, 188), (17, 194))

问题:我不知道f_lasti在某个时刻具体带来什么。

admin 更改状态以发布 2023年5月22日
0
0 Comments

官方文档所示,它确实返回字节码中最后执行字节的索引。那基本上就是列了,但不是在源代码中,而是在字节码中。你可以通过dis.dis()获得代码的反汇编,以理解f_lasti中的值:

import inspect
import dis
def cid():
  f = inspect.currentframe().f_back
  dis.dis(f.f_code)
  caller_id = (f.f_lineno, f.f_lasti)
  return caller_id
print((cid(), cid(), cid(), cid(), cid()))

我不认为python在编译后会保留字节码和列之间的映射。如果我没错的话,基本上是不可能获得列号的。

0