>>> example = '''\
... def foobar():
... print('Hello world!')
... '''
>>> codeobject = compile(example, '', 'exec')
>>> codeobject
<code object <module> at 0x11049ff60, file "", line 1>
>>> codeobject.co_consts
(<code object foobar at 0x11049fe40, file "", line 1>, 'foobar', None)
>>> codeobject.co_consts[0]
<code object foobar at 0x11049fe40, file "", line 1>
>>> codeobject.co_consts[0].co_name
'foobar'
あなたが見ることができる関数オブジェクトそのようなコードオブジェクトから作成された:
>>> import dis
>>> dis.dis(codeobject)
1 0 LOAD_CONST 0 (<code object foobar at 0x11049fe40, file "", line 1>)
2 LOAD_CONST 1 ('foobar')
4 MAKE_FUNCTION 0
6 STORE_NAME 0 (foobar)
8 LOAD_CONST 2 (None)
10 RETURN_VALUE
MAKE_FUNCTION
opcodeは、スタックからのコードオブジェクト、ならびに関数名とスタックから任意のデフォルト引数の値をとります。その前にコードオブジェクトと名前を入れたLOAD_CONST
opcodesが表示されます。
すべてのコードオブジェクトがしかし、機能わけではありません:
>>> compile('[i for i in range(10)]', '', 'exec').co_consts
(<code object <listcomp> at 0x1105cb030, file "", line 1>, '<listcomp>', 10, None)
>>> compile('class Foo: pass', '', 'exec').co_consts
(<code object Foo at 0x1105cb0c0, file "", line 1>, 'Foo', None)
あなたは関数がバイトコードにロードされているものを一覧表示したい場合は、あなたの最善の策は、解体を使用することで、コードオブジェクトを探しません:
これは、特定のコードオブジェクトにロードされているすべての関数に対して(name, codeobject)
のタプルを生成します。
ここであなたの目標は何ですか。コードオブジェクトの一部である関数のすべての名前をリストするには?または、それらの関数のすべてのコードを抽出するか? –