0
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 

なぜこれを印刷します。

4

2 に答える 2

3

このprofiler関数は、呼び出したので、プロファイリング イベントごとに呼び出さsys.setprofileれます。

呼び出されるたびに、無条件のprintステートメントを本体として配置するため、行が出力されます。 なぜそれをしたのか、私たちがあなたに伝えるのは難しいので、あなたの「なぜ」の質問は本当に、本当に独特です.

docsによると、プロファイリング イベントは単なる呼び出しと戻りです。

'call'

関数が呼び出されます (または他のコード ブロックが入力されます)。

'return'

関数 (または他のコード ブロック) が返されようとしています。

'c_call'

AC 関数が呼び出されようとしています。これは、拡張機能または組み込みの場合があります。

'c_return'

AC機能が復活しました。

これが私が観察したものです(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_callandのケースが表示されない理由がわかりません。おそらく、特定のプラットフォーム (どの OS? どのレベルの Python? どの IDE があればどの IDE) で印刷するためc_returnの暗黙的な変換がないのでしょう。utf-8

于 2010-01-11T01:08:43.163 に答える
0

なぜ arg が None なのか不思議に思われるかもしれません。 argイベントごとに意味が異なります。「return」の場合argは、返される値です。「例外」については、例外情報のトリプルです。詳細については、 http://docs.python.org/library/sys.html#sys.settraceを参照してください。

于 2010-01-11T01:08:09.810 に答える