鉴于:
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”以及 arg 和返回值的“Call”对象
- 使用反射来搜索最近调用它的类似装饰的函数(直接或间接),即它会将调用传递给 g(),因为那不是 @Tracked。
- 将上述 'Call' 对象附加到调用者的 'Call' 对象上的 'children' 列表中,如果没有找到合适的调用者,则附加到全局列表 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=...)
我被困在反射/遍历运行时堆栈帧部分。
谢谢!