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