# 创建函数对象
# 创建函数对象
# 示例代码
pi = 3.14
def circle_area(r):
return pi * r ** 2
# compile手动编译函数对象
可以使用compile函数编译函数代码,得到一个代码对象,其中函数的代码对象就嵌套在全局的常量之中。
>>> text = '''
... pi = 3.14
... def circle_area(r):
... return pi * r ** 2
... '''
>>> code = compile(text, 'test', 'exec')
>>> code.co_names
('pi', 'circle_area')
>>> code.co_consts
(3.14, <code object circle_area at 0x10e179420, file "test", line 3>, 'circle_area', None)
>>> code.co_consts[1]
<code object circle_area at 0x10e179420, file "test", line 3>
>>> code.co_consts[1].co_names
('pi',)
>>> code.co_consts[1].co_consts
(None, 2)
# 虚拟机创建函数对象过程
文件作为入口被定义在__main__模块中,全局代码对象被作为模块代码执行,产生的栈帧对象以模块属性空间作为全局名字空间和局部名字空间。
标注的两行字节码表示将3.14作为pi的值保存到模块的属性空间-也是栈帧对象的局部空间。
全局代码对象执行,将两个常量加载到栈顶-指定函数的代码对象和指定的函数名,为创建函数做准备。
创建函数对象,并且创建的函数会继承帧对象的全局名字空间。
将创建号的函数对象从栈顶弹出,并保存到模块属性空间-也是栈帧对象的局部空间。
← 函数调用与虚拟机软件栈 装饰器的语法糖本质 →