-2

非常に単純な python コードで exec を使用し、呼び出される関数を呼び出す代わりにリストします。

呼び出される関数がわかっている場合は、名前付き関数を として定義する辞書を作成し、printそれを の 2 番目の引数として使用できますexec

getitemを上書きして呼び出された関数を出力するカスタム辞書クラスを使用しようとしていますがexec、発行しても役に立ちません:

TypeError: exec: arg 2 must be a dictionary or None

関数呼び出しを一般的な方法でカスタマイズする方法はありますか?

編集

たとえば、Python で記述された次の構成ファイルがあるとします。

user('foo')
password('foo123')
home('/home/foo')

user('bar')
password('bar123')
home('/home/foo')

このファイルを実行して、そこに含まれる情報を出力する必要があります。次のpythonプログラムでそれを行うことができます:

d = { 'user': print, 'password': print, 'home: 'print }
execfile(filename, d, {})

このアプローチの問題はd、ファイルに存在するすべての関数で初期化する必要があることです。getitemで何か違うことをしたカスタム辞書を使用しようとしましたが、TypeError上記が得られました。

4

2 に答える 2

3

私は間違っているかもしれませんが、あなたが望むのは次のようです:

>>> the_functions_called_in('foo(); bar() + 4; lol(hello())')
['foo', 'bar', 'lol', 'hello']

その場合、モジュールexecが必要ではなく:ast

>>> m = ast.parse('foo(); bar() + 4; lol(hello())')
>>> [x.func.id for x in ast.walk(m) if isinstance(x, ast.Call)]
['foo', 'lol', 'bar', 'hello']

関数への引数は、オブジェクトのargsstarargskeywords、およびkwargs属性に格納されast.Callます。

実際にコードを実行し、どの関数が呼び出されたかを追跡したい (およびそれらを実行したい) 場合は、プロファイリングを試してください。

于 2013-05-09T19:16:17.627 に答える