在 dis 字节码中调用的函数比 CALL_FUNCTIONs 多

more function calls than CALL_FUNCTIONs in dis bytecode

考虑程序:

def wrap():
 print(66)

print(77,77)
wrap()

dis 模块 (3.5.2) 报告此代码表示:

  1           0 LOAD_CONST               0 (<code object wrap at 0x7f9d3b538c90, file "<dis>", line 1>)
              3 LOAD_CONST               1 ('wrap')
              6 MAKE_FUNCTION            0
              9 STORE_NAME               0 (wrap)

  4          12 LOAD_NAME                1 (print)
             15 LOAD_CONST               2 (77)
             18 LOAD_CONST               2 (77)
             21 CALL_FUNCTION            2 (2 positional, 0 keyword pair)
             24 POP_TOP

  5          25 LOAD_NAME                0 (wrap)
             28 CALL_FUNCTION            0 (0 positional, 0 keyword pair)
             31 POP_TOP
             32 LOAD_CONST               3 (None)
             35 RETURN_VALUE

这个编译后的字节码包括两个 CALL_FUNCTION 操作,但我在代码中计算了三个函数调用。为什么 print(66) 没有出现?

它在附加到函数 wrap 的代码对象中。试试 dis(wrap).