打印当前执行行上方的行

时间:2011-09-07 18:05:32

标签: python

Python脚本中有一行代码可以打印上面的行吗?


更新
动机

  • 这是一个有趣的问题。我想知道Python的强烈内省是否走得那么远。
  • 我正在保存这个以便跟进问题 - 我实际上不想“打印上面的行”,而是抓住一行代码(我知道哪些只在运行时),反汇编它并了解提到哪些变量。我将在后续行动中解释原因:)

3 个答案:

答案 0 :(得分:1)

阅读(用眼睛),您可以使用PDB

只需导入pdb然后就可以执行此操作:

代码:

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

运行代码后,你会像环境一样停在shell中,你可以这样做:

-> 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


如果你希望自动化代码阅读,而不是变形,你可以使用如此http://www.dalkescientific.com/writings/diary/archive/2005/04/20/tracing_python_code.html所示的linecache而不是打印将它放入列表并获得任何值想要:))

希望它会有所帮助。

答案 1 :(得分: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 :(得分:-2)

根据复杂程度,这可能是不明智的,你可以读取你的python文件w / readlines(),打印它们,然后在循环结构中调用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
>>>