【发布时间】:2017-10-25 22:53:06
【问题描述】:
为了好玩,我想把我自己的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 对象、存储的局部变量和函数正在运行的行号。
但是行号不够详细,因为一行中可以有嵌套的函数调用。 有什么方法可以获取返回的“地址”并强制 python 跳转到那里?或者有没有办法调用/继续Frame/FrameInfo对象?
【问题讨论】:
-
请缩进你的代码
-
看看
sys.settrace()。我已经用它做了各种疯狂的事情。
标签: python metaprogramming yield