2011-09-07 30 views
0

在Python脚本中是否有一行代码行来打印上面的行?在当前正在执行的行上面打印行


UPDATE:
动机

  • 这是一个有趣的问题。我想知道Python的强大内省是否如此。
  • 我正在保存这个问题的后续问题 - 我其实不想“打印上面的行”,而是抓住一段代码(我会知道哪些只在运行时),拆卸它并了解哪些变量被提及。我会解释为什么在后续:)
+1

也许,但你为什么需要那个?你不知道你在写什么代码吗? – delnan

+0

我不知道有一个很好的方法来实现这一点,但没有什么是不可能的。你为什么需要这个?多解释一下,必须有更好的方法来实现你想要的任何东西。 – naeg

+0

我同意w/demian,检查是非常酷...不知道你可以利用它,但http://wiki.python.org/moin/ByteplayDoc是相当惊人的 – pyInTheSky

回答

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

根据不同的复杂性,这可能是不明智的,你可以在你的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 
>>> 
+0

-1:不仅是奇怪的是,它不会工作:你不能一次执行整行文件。 –

+0

认真,反对票。我没有说这是一个好主意,我说这取决于复杂性。如果你的文件是一组数学运算,没有理由不起作用 – pyInTheSky

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


如果你想自动读码,但没有变形,你可以使用linecache,如这里http://www.dalkescientific.com/writings/diary/archive/2005/04/20/tracing_python_code.html所示,而不是打印把它放到一个列表中,并得到你想要的任何值:)

希望它会有所帮助。