почему «setprofile» распечатывает это - PullRequest
0 голосов
/ 11 января 2010
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 ]

3 голосов
/ 11 января 2010

Функция 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, если есть).

0 голосов
/ 11 января 2010

Кажется, возможно, вы удивляетесь, почему arg равен None. arg имеет разные значения для каждого события. Для «возврата» arg - это значение, которое будет возвращено. Для «исключения» это тройка информации об исключениях. См. http://docs.python.org/library/sys.html#sys.settrace для получения дополнительной информации.

...