Python - 代码类型标志

时间:2015-11-12 23:15:10

标签: python

我正在查看codetype对象,特别是co_flags属性。

我写了一个小函数

def f(a,b,c,*args):
   print a,b,c,args

编译为codetype对象。检查codetype对象,容器(外部代码类型)co_flag设置为64,函数(内部代码类型)为71

根据文档,如果函数具有变量args(例如* args)并且在外部和内部代码类型对象上设置该位,则设置0x40(64)。

我只是想知道

  • 为什么容器设置为64,因为它只是设置了函数,例如没有使用变量参数?
  • 函数codetype co_flags中的其他位是什么?

是否有各种标志的完整列表,因为文档暗示保留供内部使用'但没有提到其他什么?

我正在使用python 2.7.10

1 个答案:

答案 0 :(得分:1)

  

函数codetype co_flags中的其他位是什么?

来自dis.COMPILER_FLAG_NAMES

  1 OPTIMIZED
  2 NEWLOCALS
  4 VARARGS
  8 VARKEYWORDS
 16 NESTED
 32 GENERATOR
 64 NOFREE
128 COROUTINE
256 ITERABLE_COROUTINE

它来自Python 3,但Python 2.7中提供的标志与Include/code.h保持相同的值。它们仅由Jython记录。

  

函数(内部代码类型)是71

71 = 1 + 2 + 4 + 64

  1 OPTIMIZED
  2 NEWLOCALS
  4 VARARGS
 64 NOFREE

示例(在Python 3中):

>>> import dis
>>> def f(a, b, c, *args):
...     print(a, b, c, args)
... 
>>> dis.show_code(f)
Name:              f
Filename:          <stdin>
Argument count:    3
Kw-only arguments: 0
Number of locals:  4
Stack size:        5
Flags:             OPTIMIZED, NEWLOCALS, VARARGS, NOFREE
Constants:
   0: None
Names:
   0: print
Variable names:
   0: a
   1: b
   2: c
   3: args
  

为什么容器设置为64,因为它只是设置了函数,例如没有使用变量参数?

据我所知,“容器”是一个模块(检查co_name)。 NOFREE只是意味着模块没有freevarscellvars(总是?)为真。在pypy co_flags0the flags are the same there)。