打印当前执行行上方的行

0 投票
3 回答
658 浏览
提问于 2025-04-17 01:43

有没有办法让Python脚本中的一行代码打印出它上面那一行?


更新:
动机

  • 这是个有趣的问题。我在想Python的强大反射能力是否能做到这一点。
  • 我本来打算把这个留到后面再问——其实我并不想“打印上面那一行”,而是想抓取某一行代码(我到运行时才知道是哪一行),然后拆解它,看看里面提到了哪些变量。后面我会解释原因 :)

3 个回答

-2

根据复杂程度,这样做可能不太明智,你可以用readlines()来读取你的Python文件,把内容打印出来,然后在一个循环结构中用exec()来执行这些内容。

这是给那些认为在我提到的有限范围内不可能这样做的人看的例子。

>>> a = ["a=1+1","b=a","print b"]
>>> for item in a:
...     print item
...     exec(item)
... 
a=1+1
b=a
print b
2
>>> 
0

我觉得你可能问错问题了(也许?)——你是想获取调用栈中的最后一个项目吗?如果是这样,你可以尝试下面的做法:

import inspect

def do_add(a, b):
        if type(a) is not int or type(b) is not int:
                print inspect.stack()[1] # last stack item
                return None

        return a + b

do_add(1, 3)
do_add(1, 'asd')

http://ideone.com/IpdQa

2

如果你想要“用眼睛阅读”代码,可以使用 PDB。

只需导入 pdb,然后你可以这样做:

代码:

a = 'test'
import pdb; pdb.set_trace()

运行代码后,你会进入一个类似命令行的环境,这样你就可以进行以下操作:

-> import pdb; pdb.set_trace()
(Pdb) print a
test
(Pdb) l
  1     a = 'test';
  2  -> import pdb; pdb.set_trace()
[EOF]

你想查看 l(ist) 命令:

这个命令会列出当前文件的源代码。如果不带参数,它会列出当前行周围的 11 行代码,或者继续之前的列表。如果带一个参数,它会列出指定行周围的 11 行。如果带两个参数,它会列出给定范围的代码;如果第二个参数小于第一个,它会被当作行数来处理。

更多信息请查看 http://docs.python.org/library/pdb.html


如果你想自动化代码的变形 -

其他语言,比如 Perl、Python 和 JavaScript,允许程序在运行时创建新代码并使用 eval 函数执行它,但不允许修改已有的代码。通过修改函数指针,可以实现修改的假象(尽管实际上并没有覆盖任何机器代码)。

来源: http://en.wikipedia.org/wiki/Self-modifying_code


如果你想自动化代码的读取,但不想变形,可以使用 linecache,具体方法可以参考这里 http://www.dalkescientific.com/writings/diary/archive/2005/04/20/tracing_python_code.html,只需将结果放入一个列表中,而不是直接打印出来,这样你就可以获取你想要的任何值 :)

希望这对你有帮助。

撰写回答