1

呼び出された方法のソースコードを判別できる関数を作りたい。私は、これを一般的に検査モジュールで行う方法を知っています。たとえば、この質問はうまく機能し、lines以下に示すように変数に希望の出力を提供します。

def hello(x):
   frame,filename,line_number,function_name,lines,index=\
       inspect.getouterframes(inspect.currentframe())[1]
   print(frame,filename,line_number,function_name,lines,index)

問題は、このソリューションが対話型のコマンドラインセッションでは機能しないことです。たとえば、コマンドラインからの結果は次のようになります。

>>> y = hello(7)
(<frame object at 0x01ECA9E8>, '<stdin>', 1, '<module>', None, None)

問題は、ソースファイルが'<stdin>'であるため、lines変数がであるということですNoney = hello(7)対話型セッション中に文字列を含む結果を見つけるために呼び出し回線にアクセスするにはどうすればよいですか?

4

1 に答える 1

2

@abarnertが言うように、それは不可能かもしれません。ただし、少なくとも部分的な回避策があります。

ソースコード行の取得は最大の問題ではありません。readlineのようなモジュールはそれらを追跡します。インタラクティブPythonとiPythonは、行の公開方法が少し異なります(ため息)が、それも同じ化できます。(たとえば、私のshowlinecacherパッケージはこれを行います。そのモジュールは、通常のPythonとさまざまなインタラクティブフレーバーのソースアクセスを均等化するためにベニアを配置します。)

より大きな問題は、ソースコードを入手したとしても、inspect正当な行番号を提供しないことです(たとえば、通常のコードではうまく機能しますが、インタラクティブに呼び出されるとinspect.currentframe().f_back.f_lineno1や呼び出しのポイントなどの値が提供されます)。<stdin>

しかし、私はそれを不可能と呼ぶ準備ができていません。インタラクティブなPythonとiPythonによって生成されたトレースバックに基づくと、「この呼び出しはどこから来たのか」を再構築するために利用できる十分な情報があるようです。どれだけの労力がかかり、答えはどれほど堅固なものになるでしょう...これらは未解決の質問です。

于 2012-11-14T21:43:21.233 に答える