如何修改python字节码以在执行后打印一些内容

时间:2019-02-05 10:26:37

标签: python bytecode

我想使用pyspy生成DSL以获取zenUML的序列图

但是我对字节码的理解很差。我已经阅读了SO中用字节码和python标签的大多数问题和答案。 我正在玩byteplay和一些简单的功能来了解会发生什么。

我的目标是在通话前写东西,在通话后写东西。我想我会设法将try / finally块放在此处完成的功能周围(尚未尝试过,但似乎是一个更好的解决方案): http://code.activestate.com/recipes/577283-decorator-to-expose-local-variables-of-a-function-/

但是我想了解为什么我将代码附加到递归函数的第一种方法不起作用。

这就是我所做的:

from byteplay import *

### Some functions to play with...
def hello():
    print "hello!"

def easy(a):
    x = a*2
    print "easy: %s x 2 = %s" % (a, x)
    return x

def factorial(n):
    if n == 1:
        return 1
    else:
        return n * factorial(n-1)

# for f in (hello, easy, factorial):
#     c = Code.from_code(f.func_code)
#     print '---- code: ----'
#     print c.code
# print "*"*70

def add_hello_bye(fun):
    'Modifies the code of the given function to say hello + bye.'
    c = Code.from_code(fun.func_code)
    #print '---- org code: ----'
    #print c.code

    #hello_code = Code.from_code(hello.func_code).code[1:4]
    hello_code = [(LOAD_CONST, 'hello!'),
                  (PRINT_ITEM, None),
                  (PRINT_NEWLINE, None),
                 ]
    bye_code   = [(LOAD_CONST, 'bye!'),
                  (PRINT_ITEM, None),
                  (PRINT_NEWLINE, None)
                 ]
    c.code[0:0] = hello_code
    c.code.extend(bye_code)
    #print '---- new code: ----'
    #print c.code

    fun.func_code = c.to_code()

### Apply to easy:
add_hello_bye(easy) 
print '---- easy: ----'
print easy(4)

### Apply to factorial:
add_hello_bye(factorial) 
print '---- factorial: ----'
factorial(4)

首先我有c.code[-1:-1] = bye_code,我认为原因是RETURN_VALUE必须是最后一条指令,但是将代码放在最后才可以实现我的简单功能easy,为什么不这样做呢?递归函数factorial

编辑:我已经尝试过sys.settrace,并且有使用它的替代工作解决方案。

0 个答案:

没有答案