与えられた:
G = []
@Track
def f(x):
a = g(x)
b = h(x + 2)
return a + b
def g(x)
for n in range(2):
i(x + n)
@Track
def h(x):
return j(x) + 9
@Track
def i(x):
return x + 10
@Track
def j(x):
return 0
f、h、i、およびjの呼び出しごとに、f、h、i、jにデコレータトラックを記述して適用することは可能ですか?
- 関数名「f」、「h」、「i」、および引数値と戻り値を含む「Call」オブジェクトをインスタンス化します
- リフレクションを使用して、それを (直接的または間接的に) 呼び出した最も近い同様に装飾された関数を検索します。つまり、@Tracked ではないため、g() への呼び出しを渡します。
- 上記の「Call」オブジェクトを呼び出し元の「Call」オブジェクトの「子」リストに追加するか、適切な呼び出し元が見つからない場合はグローバル リスト G に追加します
コードの場合:
f(3)
j(3)
これにより、次の接続されたオブジェクト ツリーが作成されます。
G
-- Call(name='f',args=..., return=...)
-- Call(name='i',args=..., return=...)
-- Call(name='i',args=..., return=...)
-- Call(name='i',args=..., return=...)
-- Call(name='h',args=..., return=...)
-- Call(name='j', args=..., return=...)
-- Call(name='j', args=..., return=...)
リフレクション/ランタイム スタック フレーム部分のトラバースで立ち往生しています。
ありがとう!