Python解释器简介(2):代码对象
admin
2023-07-31 00:48:28
0

这是Python解释器简介的第二部分。第一部分请点击这里 。

完成编译之前的三个步骤都是在检查一个简单的函数对象。我们现在来谈谈更深层次的对象——函数的代码对象。

12345678 >>> def foo(a):...     x = 3...     return x + a...>>> foo<function foo at 0x107ef7aa0>>>> foo.func_code<code object foo at 0x107eeccb0, file \”\”, line 1>

从上面的代码,你能发现所谓的代码对象就是函数对象的一个属性。(这个函数对象还有许多其它的属性,但它们大多都很无聊,因为 foo 函数实在是太简单了。)

代码对象是在Python编译器中生成的,并且在解释器中完成解释工作。它向解释器传递“开工了”的信息。我们再来看看代码对象的属性。

1234567 >>> dir(foo.func_code)[\’__class__\’, \’__cmp__\’, \’__delattr__\’, \’__doc__\’, \’__eq__\’, \’__format__\’, \’__ge__\’,\’__getattribute__\’, \’__gt__\’, \’__hash__\’, \’__init__\’, \’__le__\’, \’__lt__\’, \’__ne__\’, \’__new__\’,\’__reduce__\’, \’__reduce_ex__\’, \’__repr__\’, \’__setattr__\’, \’__sizeof__\’, \’__str__\’,\’__subclasshook__\’, \’co_argcount\’, \’co_cellvars\’, \’co_code\’, \’co_consts\’, \’co_filename\’,\’co_firstlineno\’, \’co_flags\’, \’co_freevars\’, \’co_lnotab\’, \’co_name\’, \’co_names\’, \’co_nlocals\’,\’co_stacksize\’, \’co_varnames\’]

这个属性列表虽然很长,但是其中大多数属性我们今天并不会涉及。我们只关注3个有趣的 foo 函数代码对象的属性。

123456 >>> foo.func_code.co_varnames(\’a\’, \’x\’)>>> foo.func_code.co_consts(None, 3)>>> foo.func_code.co_argcount1

通过调用它们,我们能依次得到:变量名、函数中已知的常量和函数参数的数量。但是目前为止,我们还是不知道生成代码对象的指令到底是什么。事实上,这个指令叫做字节码。字节码也是代码对象的一个属性:

12 >>> foo.func_code.co_code\’d\\x01\\x00}\\x01\\x00|\\x01\\x00|\\x00\\x00\\x17S\’

我们得到了许多待分解的信息。这里到底发生了什么?在下一部分,我们将深入研究字节码。

相关内容

热门资讯

Mobi、epub格式电子书如... 在wps里全局设置里有一个文件关联,打开,勾选电子书文件选项就可以了。
定时清理删除C:\Progra... C:\Program Files (x86)下面很多scoped_dir开头的文件夹 写个批处理 定...
500 行 Python 代码... 语法分析器描述了一个句子的语法结构,用来帮助其他的应用进行推理。自然语言引入了很多意外的歧义,以我们...
scoped_dir32_70... 一台虚拟机C盘总是莫名奇妙的空间用完,导致很多软件没法再运行。经过仔细检查发现是C:\Program...
65536是2的几次方 计算2... 65536是2的16次方:65536=2⁶ 65536是256的2次方:65536=256 6553...
小程序支付时提示:appid和... [Q]小程序支付时提示:appid和mch_id不匹配 [A]小程序和微信支付没有进行关联,访问“小...
pycparser 是一个用... `pycparser` 是一个用 Python 编写的 C 语言解析器。它可以用来解析 C 代码并构...
微信小程序使用slider实现... 众所周知哈,微信小程序里面的音频播放是没有进度条的,但最近有个项目呢,客户要求音频要有进度条控制,所...
Apache Doris 2.... 亲爱的社区小伙伴们,我们很高兴地向大家宣布,Apache Doris 2.0.0 版本已于...
python清除字符串里非数字... 本文实例讲述了python清除字符串里非数字字符的方法。分享给大家供大家参考。具体如下: impor...