快轉到主要內容

20240826

-

Python dis

码农高天 常常會用 dis 函數來解釋底層語法,看了但從來沒用過,紀念一下第一次用。

import dis
def example():
    with open('file.txt', 'r') as file:
        content = file.read()

dis.dis(example)

輸出:

(.venv) leo@MBP P5D % python3 t.py                  
  2           0 RESUME                   0

  3           2 LOAD_GLOBAL              1 (NULL + open)
             12 LOAD_CONST               1 ('file.txt')
             14 LOAD_CONST               2 ('r')
             16 CALL                     2
             24 BEFORE_WITH
             26 STORE_FAST               0 (file)

  4          28 LOAD_FAST                0 (file)
             30 LOAD_ATTR                3 (NULL|self + read)
             50 CALL                     0
             58 STORE_FAST               1 (content)

  3          60 LOAD_CONST               0 (None)
             62 LOAD_CONST               0 (None)
             64 LOAD_CONST               0 (None)
             66 CALL                     2
             74 POP_TOP
             76 RETURN_CONST             0 (None)
        >>   78 PUSH_EXC_INFO
             80 WITH_EXCEPT_START
             82 POP_JUMP_IF_TRUE         1 (to 86)
             84 RERAISE                  2
        >>   86 POP_TOP
             88 POP_EXCEPT
             90 POP_TOP
             92 POP_TOP
             94 RETURN_CONST             0 (None)
        >>   96 COPY                     3
             98 POP_EXCEPT
            100 RERAISE                  1
ExceptionTable:
  26 to 58 -> 78 [1] lasti
  78 to 86 -> 96 [3] lasti

簡單解讀:

  • 數字 2, 3, 4, 3: 對應 Python 程式碼行數
  • CALL 2: stack 要 pop 的參數數量,pop (NULL + open), ('file.txt'), ('r') 給 __enter__()
  • BEFORE_WITH: 載入 with 關鍵字用的 __exit__()__enter__()
  • STORE_FAST: 儲存 STACK.pop() 的變數
  • LOAD_ATTR: 載入方法 method
  • RETURN_CONST: 回傳程式結束碼

名詞:

  • lasti: last instruction
  • ExceptionTable: 決定 raised exception 後要跳去哪 ,感覺和 interrupt vector 滿像的 >>: 跳轉位置
ZSL
作者
ZSL
正事不做。

相關文章

20240812
AMD 產品命名