tags:

views:

41

answers:

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

A: 

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.

Ned Batchelder
+2  A: 

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

Alex Martelli