2017-06-04 83 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'