为什么'setprofile'会打印这个

0 投票
2 回答
1740 浏览
提问于 2025-04-15 17:52
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 

为什么要打印这个。

2 个回答

0

看起来你可能在想,为什么 arg 是 None。其实 arg 在不同的事件中有不同的含义。比如在“返回”这个事件中,arg 就是要返回的值。而在“异常”事件中,arg 是一个包含异常信息的三元组。想了解更多,可以查看这个链接:http://docs.python.org/library/sys.html#sys.settrace

3

每次发生性能分析事件时,profiler 函数都会被调用,因为你对它使用了 sys.setprofile

每次被调用时,它都会打印一行内容,因为你在它的主体里放了一个无条件的 print 语句。至于你为什么这样做,我们很难告诉你,这让你的“为什么”问题变得非常奇怪。

性能分析事件其实就是一些函数的调用和返回,具体来说,参考文档

'call'

一个函数被调用(或者进入了其他代码块)。

'return'

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

'c_call'

一个C语言函数即将被调用。这可能是一个扩展函数或内置函数。

'c_return'

一个C语言函数已经返回。

在我观察到的(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_callc_return 的情况,可能是因为在你的特定平台上打印时没有隐式的 utf-8 转换(你用的是什么操作系统?什么版本的Python?如果有的话,使用的是什么IDE)。

撰写回答