美文网首页思科DevNet
python中dis的用法

python中dis的用法

作者: xor_eax_eax | 来源:发表于2018-03-05 10:03 被阅读0次

    dis库是python(默认的CPython)自带的一个库,可以用来分析字节码

    例子

    首先导入dis库

    >>> import dis
    

    然后在repl中,创建一个函数

    >>> def add(a, b = 0):
    ...     return a + b
    ... 
    >>> 
    

    最后将add函数传给dis库的dis函数

    >>> dis.dis(add)
      2           0 LOAD_FAST                0 (a)
                  2 LOAD_FAST                1 (b)
                  4 BINARY_ADD
                  6 RETURN_VALUE
    >>> 
    

    repl会返回add函数的字节码.

    分析

    来看看dis函数的源码

    def dis(x=None, *, file=None):
        """Disassemble classes, methods, functions, generators, or code.
        With no argument, disassemble the last traceback.
        """
        if x is None:
            distb(file=file)
            return
        if hasattr(x, '__func__'):  # Method
            x = x.__func__
        if hasattr(x, '__code__'):  # Function
            x = x.__code__
        if hasattr(x, 'gi_code'):  # Generator
            x = x.gi_code
        if hasattr(x, '__dict__'):  # Class or module
            items = sorted(x.__dict__.items())
            for name, x1 in items:
                if isinstance(x1, _have_code):
                    print("Disassembly of %s:" % name, file=file)
                    try:
                        dis(x1, file=file)
                    except TypeError as msg:
                        print("Sorry:", msg, file=file)
                    print(file=file)
        elif hasattr(x, 'co_code'): # Code object
            disassemble(x, file=file)
        elif isinstance(x, (bytes, bytearray)): # Raw bytecode
            _disassemble_bytes(x, file=file)
        elif isinstance(x, str):    # Source code
            _disassemble_str(x, file=file)
        else:
            raise TypeError("don't know how to disassemble %s objects" %
                            type(x).__name__)
    

    x参数可以是None、Method、Function、Generator、Class、module、Code object、Raw bytecode、Source code,如果x是Method、Function、Generator,只用返回对应的字节码,
    如果x是Class或者module,那会返回x的所有元素(先排序)的字节码,这一句代码x.dict.items()有提现.如果x是Code object或者Raw bytecode,或者Source code,那么会调用对应的disassemble函数. disassemble函数是干嘛的呢,顾名思义,就是assemble的反义词, assemble是汇编的意思,那disassemble自然是有一个 反汇编 的意思,当然这里并不是真的反汇编,而是只是输出字节码.

    disassemble的函数细节可以自己去看看源码,源码也在dis.py里

    源码

    https://github.com/python/cpython/blob/3.6/Lib/dis.py

    相关文章

      网友评论

        本文标题:python中dis的用法

        本文链接:https://www.haomeiwen.com/subject/mmgoxftx.html