为了好玩,我想要推出自己的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)
为了获取/应用调用者状态,我发现我可以使用sys
和inspect
来获取正在运行的堆栈上的Frame
个对象(以便我可以对调用者执行某些操作)。从那里我可以提取所有细节,包括function
对象,存储的局部变量和运行函数的行号。
但是行号不够详细,因为在一行中可以嵌套函数调用。 有没有办法获得回报"地址"并强迫蟒蛇跳到那里?或者有没有办法打电话/继续Frame
/ FrameInfo
对象?
答案 0 :(得分:0)
一个框架的f_lasti
是它与“程序计数器”最接近的东西,但这还不够。你不能从Python级代码中设置f_lasti
,即使你可以(也许你正在使用“{规则”按钮“ctypes
),你仍然无法做到弄乱f_lasti
。暂停和恢复帧。