[Python] Understanding the built-in compile function in Python

Discussão em 'Python' iniciado por Stack, Abril 5, 2025.

  1. Stack

    Stack Membro Participativo

    I am learning about compile() and the dis module. If I have all my code in the same module, I can see how every line in compiled. I am now trying to understand how code from multiple modules is compiled.

    For this, I have the following two files.

    #test.py
    import sys
    from temp import doubler

    def tripler(n: int) -> int:
    f = 3 * n

    return f

    if __name__ == '__main__':
    n = int(sys.argv[1]) if len(sys.argv) > 1 else 4
    t = tripler(n)
    s = doubler(t)
    print(s)


    #temp.py
    def doubler(x):
    y = 2 * x
    return y


    I then run compile() for the text from test.py and the output of dis.dis() is as follows

    0 0 RESUME 0

    1 2 LOAD_CONST 0 (0)
    4 LOAD_CONST 1 (None)
    6 IMPORT_NAME 0 (sys)
    8 STORE_NAME 0 (sys)

    2 10 LOAD_CONST 0 (0)
    12 LOAD_CONST 2 (('doubler',))
    14 IMPORT_NAME 1 (temp)
    16 IMPORT_FROM 2 (doubler)
    18 STORE_NAME 2 (doubler)
    20 POP_TOP

    4 22 LOAD_CONST 3 ('n')
    24 LOAD_NAME 3 (int)
    26 LOAD_CONST 4 ('return')
    28 LOAD_NAME 3 (int)
    30 BUILD_TUPLE 4
    32 LOAD_CONST 5 (<code object tripler at 0x00000255AB98F910, file "test.py", line 4>)
    34 MAKE_FUNCTION 4 (annotations)
    36 STORE_NAME 4 (tripler)

    9 38 LOAD_NAME 5 (__name__)
    40 LOAD_CONST 6 ('__main__')
    42 COMPARE_OP 40 (==)
    46 POP_JUMP_IF_FALSE 69 (to 186)

    10 48 PUSH_NULL
    50 LOAD_NAME 6 (len)
    52 LOAD_NAME 0 (sys)
    54 LOAD_ATTR 14 (argv)
    74 CALL 1
    82 LOAD_CONST 7 (1)
    84 COMPARE_OP 68 (>)
    88 POP_JUMP_IF_FALSE 21 (to 132)
    90 PUSH_NULL
    92 LOAD_NAME 3 (int)
    94 LOAD_NAME 0 (sys)
    96 LOAD_ATTR 14 (argv)
    116 LOAD_CONST 7 (1)
    118 BINARY_SUBSCR
    122 CALL 1
    130 JUMP_FORWARD 1 (to 134)
    >> 132 LOAD_CONST 8 (10)
    >> 134 STORE_NAME 8 (n)

    11 136 PUSH_NULL
    138 LOAD_NAME 4 (tripler)
    140 LOAD_NAME 8 (n)
    142 CALL 1
    150 STORE_NAME 9 (t)

    12 152 PUSH_NULL
    154 LOAD_NAME 2 (doubler)
    156 LOAD_NAME 9 (t)
    158 CALL 1
    166 STORE_NAME 10 (s)

    13 168 PUSH_NULL
    170 LOAD_NAME 11 (print)
    172 LOAD_NAME 10 (s)
    174 CALL 1
    182 POP_TOP
    184 RETURN_CONST 1 (None)

    9 >> 186 RETURN_CONST 1 (None)

    Disassembly of <code object tripler at 0x00000255AB98F910, file "test.py", line 4>:
    4 0 RESUME 0

    5 2 LOAD_CONST 1 (3)
    4 LOAD_FAST 0 (n)
    6 BINARY_OP 5 (*)
    10 STORE_FAST 1 (f)

    7 12 LOAD_FAST 1 (f)
    14 RETURN_VALUE


    I can see that the symbol doubler is imported from temp. I cannot see the codeobject for it though. I also don't understand at which stage it is even compiled. The code object executes fine. Can someone explain what happens with the module temp?

    Continue reading...

Compartilhe esta Página