我正在查看codetype对象,特别是co_flags属性。
我写了一个小函数
def f(a,b,c,*args):
print a,b,c,args
编译为codetype对象。检查codetype对象,容器(外部代码类型)co_flag设置为64,函数(内部代码类型)为71
根据文档,如果函数具有变量args(例如* args)并且在外部和内部代码类型对象上设置该位,则设置0x40(64)。
我只是想知道
是否有各种标志的完整列表,因为文档暗示保留供内部使用'但没有提到其他什么?
我正在使用python 2.7.10
答案 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
只是意味着模块没有freevars
,cellvars
(总是?)为真。在pypy
co_flags
上0
(the flags are the same there)。