在超過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