【问题标题】:How to get "program counter" for functions on the stack?如何获取堆栈上函数的“程序计数器”?
【发布时间】: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)

为了获取/应用调用者状态,我发现我可以使用sysinspect 来获取正在运行的堆栈上的Frame 对象(这样我就可以对调用者做一些事情)。从中我可以提取所有详细信息,包括 function 对象、存储的局部变量和函数正在运行的行号。

但是行号不够详细,因为一行中可以有嵌套的函数调用。 有什么方法可以获取返回的“地址”并强制 python 跳转到那里?或者有没有办法调用/继续Frame/FrameInfo对象?

【问题讨论】:

  • 请缩进你的代码
  • 看看sys.settrace()。我已经用它做了各种疯狂的事情。

标签: python metaprogramming yield


【解决方案1】:

一个框架的f_lasti 是最接近它所拥有的“程序计数器”的东西,但这还不够。你不能从 Python 级代码设置f_lasti,即使你可以(也许你正在使用ctypes 的“拧规则”按钮),你仍然无法暂停和恢复通过与f_lasti 混淆来构建框架。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-13
    • 1970-01-01
    • 2012-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-23
    • 2012-10-26
    相关资源
    最近更新 更多