2017-06-04 98 views
1

在超過uncompyle6編譯錯誤的工作我已經遇到試圖調和CPython的組件輸出什麼Python的 文檔描述了MAKE_FUNCTION問題 。代碼生成Python 3的註釋與默認值

的Python來源:

def foo(x: 'an argument that defaults to 5' = 5): 
    return 

Disassemby(X d是的版本):

# Argument count: 1 
# Kw-only arguments: 0 
# Number of locals: 1 
# Stack size:  1 
# Flags:    0x00000043 (NOFREE | NEWLOCALS | OPTIMIZED) 
# First Line:  1 
# Constants: 
# 0: 5 
# 1: 'an argument that defaults to 5' 
# 2: ('x',) 
# 3: <code object foo at 0x7f49115938a0, file "exec", line 1> 
# 4: 'foo' 
# 5: None 
# Names: 
# 0: foo 
1 0 LOAD_CONST    0 (5) 
    3 LOAD_CONST    1 ('an argument that defaults to 5') 
    6 LOAD_CONST    2 (('x',)) 
    9 LOAD_CONST    3 (<code object foo at 0x7f49115938a0, file "exec", line 1>) 
    12 LOAD_CONST    4 ('foo') 
    15 EXTENDED_ARG    2 (131072) 
    18 MAKE_FUNCTION  131073 (1 positional, 0 name and default, 2 annotations) 
    21 STORE_NAME    0 (foo) 
    24 LOAD_CONST    5 (None) 
    27 RETURN_VALUE 

注意,在偏移18的數值基本上與ARG值在偏移19(1)加上延伸ARG值。

括號中的解釋是xdis的,可能不正確。 編輯:它不僅是正確的,而且偏移量6中指出元組的其他對是必不可少的。

https://docs.python.org/3.4/library/dis.html#opcode-MAKE_FUNCTION它說:

壓入堆棧上一個新的函數對象。從底部到頂部,所消耗的堆棧必須在位置順序包括

  • 的argc & 0xFF的默認參數對象
  • (argc個>> 8)的名稱和默認參數的& 0xFF的對,與名稱正下方的對象在堆棧上,對於以關鍵字唯一參數
  • (argc個>> 16)& 0x7FFF的參數註釋對象
  • 的元組列表的參數名的說明(僅當有任何註釋對象)

它在我看來就像有一個註釋對象,而不是兩個。還有一個默認參數,而不是一個位置參數。另外在偏移量爲24時我們看到提到了5,但是這是我們有 MAKE_FUNCTION。默認值與參數x的關聯在代碼中是難以捉摸的。這裏有一些優化?

我如何理解程序集作爲Python源代碼的精確表示?

注:我看到至少Python 3.1中,生成的驗證碼 - 3.5

回答

1

下面是uncompyle6是deparse以上。我不完全確定mkfunc_annotate的第一個參數被正確地稱爲pos_arg而不是默認值arg是正確的。

上述程序集中的一個細微之處在於LOAD_CONST是一個元組(帶有一個參數),這對於提示解析器(或人員)是重要的,因爲該函數是註釋的。

stmts 
    sstmt 
     stmt 
      funcdef_annotate (2) 
       0. mkfunc_annotate (7) 
        0. pos_arg 
         expr 
          L. 1  0 LOAD_CONST   5 5 
        1. annotate_arg 
         expr 
             3 LOAD_CONST    'an argument that defaults to 5' 
        2. annotate_tuple 
            6 LOAD_CONST    ('x',) 
        3.    9 LOAD_CONST    '<code_object foo>' 
        4.    12 LOAD_CONST    'foo' 
        5.    15 EXTENDED_ARG  131074 '131072' 
        6.    18 MAKE_FUNCTION_A_2_1  '1 positional, 0 keyword pair, 2 annotated' 
       1. designator 
           21 STORE_NAME    'foo'