python中dis的用法

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

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 编程派微信号:codingpy 本文约有 15000 字,读完可能需要 20 分钟。原文地址: 500lines。...
    罗义的夏天阅读 65,100评论 0 22
  • 本节内容 Python介绍 发展史 Python 2 or 3? 安装 Hello World程序 变量 用户输入...
    小小不懂11阅读 8,747评论 2 30
  • 放着我的旅行日记没写,倒是跑来先写这些乱七八糟的东西了。一个假期都在反反复复想着始终在心里的事情,得到的答案却还是...
    阿喂阅读 3,465评论 0 2
  • 如果说生气是自找的,很多人都不以为然。生气的源头,往往是对方的意图与自己的意念发生冲突,最终没有按自己的意图...
    我爱语雯阅读 1,621评论 0 2
  • 都说金牛座好吃但不懒做,这是一个星座界公认的说法。 对于“不懒做”,不可置否,从大学工业自动化专业毕业后,我误打误...
    斯诺史蒂芬周阅读 3,110评论 0 0

友情链接更多精彩内容