0
import sys
def a():
    print 'aaa'
def profiler(frame, event, arg):
    print event, frame.f_code.co_name, frame.f_lineno, "->", arg

# profiler is activated on the next call, return, or exception
sys.setprofile(profiler)
a()

打印

call a 5 -> None#what is it
aaa
return a 6 -> None#what is it 
return <module> 12 -> None#what is it 

为什么要打印这个。

4

2 回答 2

3

profiler函数在每个分析事件中都会被调用,因为您调用sys.setprofile了它。

每次调用它时,它都会打印一行,因为您将无条件print语句作为其主体。 为什么你这样做,我们很难告诉你,让你的“为什么”问题真的,真的很奇怪。

根据文档,分析事件只是调用和返回:

'call'

调用了一个函数(或输入了一些其他代码块)。

'return'

一个函数(或其他代码块)即将返回。

'c_call'

AC 函数即将被调用。这可能是扩展功能或内置功能。

'c_return'

AC 功能已返回。

这是在稍微简单、更清晰的情况下观察到的(Python 2.5 或 2.6,MacOSX):

>>> def a():
...     print 'aaa'
... 
>>> def profiler(frame, event, arg):
...     print 'PROF %r %r' % (event, arg)
... 
>>> sys.setprofile(profiler)
PROF 'return' None
>>> a()
PROF 'call' None
PROF 'c_call' <built-in function utf_8_decode>
PROF 'c_return' <built-in function utf_8_decode>
PROF 'return' (u'a()\n', 4)
PROF 'call' None
PROF 'call' None
aaa
PROF 'return' None
PROF 'return' None

不知道为什么你没有看到你应该看到的c_call情况c_return——也许在你的特定平台上没有隐式utf-8的打印转换(什么操作系统?什么级别的 Python?如果有的话是什么 IDE)。

于 2010-01-11T01:08:43.163 回答
0

似乎您想知道为什么 arg 是 None。 arg每个事件都有不同的含义。对于“return”,arg是要返回的值。对于“异常”,它是异常信息的三元组。有关详细信息,请参阅http://docs.python.org/library/sys.html#sys.settrace

于 2010-01-11T01:08:09.810 回答