如何获得"程序计数器"对于堆栈上的函数?

时间:2017-10-25 22:53:07

标签: python metaprogramming yield

为了好玩,我想要推出自己的yield版本。像这样:

class YieldJump(BaseException):
    ...
def Yield(returnVal):
    state = getCallerState()
    raise YieldJump(returnVal, state) 
class YieldWrap:
    def __init__(self, func, *vararg, **kwarg):
        # record function and argument
    def __call__(self):
        try: 
            ...
        except YieldJump as e:
            # record state and return value
def totalArbitraryFunction(...):
    ...
    Yield(i)
    ...
    Yield(i)
    ...
    Yield(i)
    ...
for i in YieldWrap(totalArbitraryFunction, arg1, arg2, ...):
    print(i)

为了获取/应用调用者状态,我发现我可以使用sysinspect来获取正在运行的堆栈上的Frame个对象(以便我可以对调用者执行某些操作)。从那里我可以提取所有细节,包括function对象,存储的局部变量和运行函数的行号。

但是行号不够详细,因为在一行中可以嵌套函数调用。 有没有办法获得回报"地址"并强迫蟒蛇跳到那里?或者有没有办法打电话/继续Frame / FrameInfo对象?

1 个答案:

答案 0 :(得分:0)

一个框架的f_lasti是它与“程序计数器”最接近的东西,但这还不够。你不能从Python级代码中设置f_lasti,即使你可以(也许你正在使用“{规则”按钮“ctypes),你仍然无法做到弄乱f_lasti。暂停和恢复帧。