<p>如果您对python中的字节码级内容感兴趣,让我来介绍<code>dis</code>、<code>compile</code>和<code>CodeType</code></p>
<p><strong>不要在生产代码中执行这些操作</p>
<p>您可以将<code>compile</code>python代码(作为字符串)转换为code对象,然后该对象可以重写functions <code>__code__</code>属性</p>
<pre><code>def foo():
print('hi there')
code_stuff = compile("print('this is hacked in')", "dummy file", "exec")
foo.__code__ = code_stuff
foo() #prints "this is hacked in"
</code></pre>
<p>如果要修改多个no inputs no outputs函数,请查看<code>types.CodeType</code>构造函数:</p>
<pre><code>>>> import types
>>> help(types.CodeType)
Help on class code in module builtins:
class code(object)
| code(argcount, kwonlyargcount, nlocals, stacksize, flags, codestring,
| constants, names, varnames, filename, name, firstlineno,
| lnotab[, freevars[, cellvars]])
|
| Create a code object. Not for the faint of heart.
| ...
</code></pre>
<p>这与编写汇编代码很相似,可能会导致seg错误、python解释器崩溃甚至更糟。你知道当唯一的文档是<code>Not for the faint of heart.</code>时,开发人员并不打算直接使用它。你知道吗</p>
<p>如果您想查看实际执行的字节码,可以使用<code>dis</code>。是“拆卸”的缩写</p>
<pre><code>def foo():
print('hi there')
import dis
dis.dis(foo)
</code></pre>
<p>看看python代码实际上是如何执行的,这很有趣。你知道吗</p>
<p>我不确定您到底想用这个堆栈做什么,但我相当肯定它到底是什么,python的开发人员已经确保它不容易,因为这在python中不是您应该接触的东西。这些类型只存在于python中是为了内省(比如通过检查函数的调用签名来查看函数在运行时的参数)</p>