Функция profiler
вызывается при каждом событии профилирования, потому что вы вызвали sys.setprofile
для него.
Каждый раз, когда он вызывается, он печатает строку, потому что вы помещаете безусловный оператор print
в качестве его тела. Почему вы это сделали, нам трудно сказать вам, что делает ваши вопросы "почему" действительно, действительно своеобразными.
События профилирования - это просто вызовы и возвраты, за документы :
'call'
Функция вызывается (или какая-то другая
введен блок кода).
'return'
Функция (или другой кодовый блок)
собирается вернуться.
'c_call'
Функция C будет вызвана.
Это может быть функция расширения или
встроенный.
'c_return'
Функция C вернулась.
Вот что I наблюдает (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, если есть).