Python3.7-如何从字节码的代码对象获取函数签名?

时间:2018-11-15 11:17:53

标签: python python-3.x

我需要从字节码中找出函数签名。我试图将检查功能添加到反汇编中,但出现了一些问题。

这是要编译为字节码的源代码:

>cat ~/tmp/func.py 
x=100
def foo(n):
    m = 10
    return n + m

a=foo(x)
print(a)

这是我对Lib / dis.py中的dis软件包的修改:

import inspect   **<== my edit**
def _disassemble_recursive(co, *, file=None, depth=None):
    if depth is None or depth > 0:
        if depth is not None:
            depth = depth - 1 
        for x in co.co_consts:
            if hasattr(x, 'co_code'):
                print(file=file)
                print("Disassembly of function ", x.co_name, x)   **<== my edit**
                sig = inspect.signature(x)
                _disassemble_recursive(x, file=file, depth=depth)

重建Python后,在运行反汇编时出现以下错误:

>python3.7 -m dis ~/tmp/func.py

TypeError: <code object foo at 0x7fd594354ac0, file "~/tmp/func.py", line 2> is not a callable object

我的直接问题是-如何从代码对象获取可调用对象?

也许我走错了路,最终目标是,我需要破解Python 3.7的反汇编程序,以便获得函数的签名。

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

这是获取代码对象签名的一种非常糟糕的方法,但是尝试起来很酷。

这就是我所做的:

import inspect
import types

def sig_from_code(code: types.CodeType):
    return inspect.signature(
        types.FunctionType(code, {})
    )

希望这会有所帮助:D