开发者

why 'setprofile' print this

开发者 https://www.devze.com 2022-12-15 20:19 出处:网络
import sys def a(): 开发者_开发技巧print \'aaa\' def profiler(frame, event, arg): print event, frame.f_code.co_name, frame.f_lineno, \"->\", arg
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()

print

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

why print this.


The profiler function gets called at each profiling event because you called sys.setprofile on it.

Each time it's called, it prints a line, because you put an unconditional print statement as its body. Why you did that, is hard for us to tell you, making your "why" questions really, truly peculiar.

Profiling events are just calls and returns, per the docs:

'call'

A function is called (or some other code block entered).

'return'

A function (or other code block) is about to return.

'c_call'

A C function is about to be called. This may be an extension function or a built-in.

'c_return'

A C function has returned.

Here's what I observe (Python 2.5 or 2.6, MacOSX) in a slightly simpler, sharper case:

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

Not sure why you don't see the c_call and c_return cases as you should -- maybe there is no implicit utf-8 conversion for printing in your specific platform (what OS? what level of Python? what IDE if any).


It seems like maybe you're wondering why arg is None. arg has different meanings for each event. For "return", arg is the value to be returned. For "exception", it's a triple of exception information. See http://docs.python.org/library/sys.html#sys.settrace for more information.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号