打印当前执行行上方的行
有没有办法让Python脚本中的一行代码打印出它上面那一行?
更新:
动机
- 这是个有趣的问题。我在想Python的强大反射能力是否能做到这一点。
- 我本来打算把这个留到后面再问——其实我并不想“打印上面那一行”,而是想抓取某一行代码(我到运行时才知道是哪一行),然后拆解它,看看里面提到了哪些变量。后面我会解释原因 :)
3 个回答
根据复杂程度,这样做可能不太明智,你可以用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
>>>
我觉得你可能问错问题了(也许?)——你是想获取调用栈中的最后一个项目吗?如果是这样,你可以尝试下面的做法:
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')
如果你想要“用眼睛阅读”代码,可以使用 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,只需将结果放入一个列表中,而不是直接打印出来,这样你就可以获取你想要的任何值 :)
希望这对你有帮助。