2017-09-02 12 views
-1

は、私は次のコードを持っている:python3:コードオブジェクトから定義された関数を取得していますか? python3で

path = '/path/to/file/containing/python/code' 
source = open(path, 'r').read() 
codeobject = compile(source, path, 'exec') 

を私はcodeobjectを検討してきたが、私は、そのオブジェクト内で定義されているすべての関数の一覧を取得する方法が表示されません。

文字列defで始まる行はsource文字列で検索できますが、可能であればコードオブジェクトからこの情報を取得したいと考えています。

私には何が欠けていますか?

+0

ここであなたの目標は何ですか。コードオブジェクトの一部である関数のすべての名前をリストするには?または、それらの関数のすべてのコードを抽出するか? –

答えて

1

コードオブジェクトは入れ子構造です。コードオブジェクトがを実行したときに、自分の体は、定数の一部である個別のコードオブジェクトとして埋め込まれて機能は、を作成している:あなたはトップレベルのコードオブジェクトを逆アセンブルするとき

>>> 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)のタプルを生成します。

+0

私は参照してください。しかし、co_constsリストの項目のすべてがコードオブジェクトであるとは限りません。私はそれぞれの型をチェックして、それらがネストされたコードオブジェクトであるかどうかを知る方法を知らない。 '型(codeobject [0])が何であるか:' ???私は 'type(codeobject [0])がcode:'だった場合にしようとしましたが、失敗しました。 – HippoMan

+0

@HippoMan: 'type(codeobject)'はあなたに正しいタイプを与えます。 –

+0

はい、 'type(codeobject)'とはどうしたらいいですか? Python型の名前は何ですか? 'type(codeobject)は何ですか' ??? 'if'文の中で「WHAT」を置き換えるものは何ですか? – HippoMan

関連する問題