函数具有代码内部代码的代码对象属性,并且 代码对象具有字节码属性。通过执行字节码, python执行函数代码。
import
模块答案 0 :(得分:1)
在CPython模块中,没有在运行时附加的代码对象。 *.pyc
文件包含模块的字节码,但在import
执行后会被丢弃,因为导入后不再需要它。
鉴于它是模块的第一次导入,运行时会检查是否存在最新的缓存字节码文件。如果有,则加载它,并在新的module
对象的上下文中执行代码对象。如果没有,则将源编译为字节码,可能写入文件,并在新的module
对象的上下文中执行。
那么如何获取模块的字节码呢?如果您有字节码文件,则可以从中解组字节码。假设我们有一个只包含print('Hello, World!')
的模块:
>>> data = open('__pycache__/test.cpython-35.pyc', 'rb').read()
>>> import imp
>>> data.startswith(imp.get_magic())
True
>>> import marshal
>>> marshal.loads(data[len(imp.get_magic())+8:])
<code object <module> at 0x7f47b4fb5b70, file "/home/bj/test.py", line 4>
>>> import dis
>>> dis.dis(marshal.loads(data[len(imp.get_magic())+8:]))
4 0 LOAD_NAME 0 (print)
3 LOAD_CONST 0 ('Hello, World!')
6 CALL_FUNCTION 1 (1 positional, 0 keyword pair)
9 POP_TOP
10 LOAD_CONST 1 (None)
13 RETURN_VALUE
如果您只有源代码:compile()
:
>>> compile("print('Hello, World!')", '<input>', 'exec')
<code object <module> at 0x7f47b4fc0f60, file "<input>", line 1>
>>> dis.dis(compile("print('Hello, World!')", '<input>', 'exec'))
1 0 LOAD_NAME 0 (print)
3 LOAD_CONST 0 ('Hello, World!')
6 CALL_FUNCTION 1 (1 positional, 0 keyword pair)
9 POP_TOP
10 LOAD_CONST 1 (None)
13 RETURN_VALUE 13 RETURN_VALUE