34

Python のexecステートメントを使用しようとしたときに、次のエラーが発生しました。

TypeError: exec: arg 1 must be a string, file, or code object

文字列やファイルを渡したくありませんが、コード オブジェクトとは何ですか? また、どのように作成すればよいでしょうか?

4

3 に答える 3

36

コード オブジェクトを作成する 1 つの方法は、compile組み込み関数を使用することです。

>>> compile('sum([1, 2, 3])', '', 'single')
<code object <module> at 0x19ad730, file "", line 1>
>>> exec compile('sum([1, 2, 3])', '', 'single')
6
>>> compile('print "Hello world"', '', 'exec')
<code object <module> at 0x19add30, file "", line 1>
>>> exec compile('print "Hello world"', '', 'exec')
Hello world

また、関数には、関数のコード オブジェクトを取得できる function 属性__code__(古いバージョンでも知られfunc_codeています) があります。

>>> def f(s): print s
... 
>>> f.__code__
<code object f at 0x19aa1b0, file "<stdin>", line 1>
于 2011-04-24T04:47:41.760 に答える
30

コード オブジェクトを手動で作成する方法や、それらを再び逆アセンブルする方法など、このトピックについて説明している Dan Crosta による優れたブログ投稿があります。

Python コード オブジェクトの調査

于 2012-11-20T09:13:39.313 に答える
18

コードオブジェクトはここで説明されています:

コード オブジェクトは、バイト コンパイルされた 実行可能な Python コード、またはbytecodeを表します。コード オブジェクトと関数オブジェクトの違いは、関数オブジェクトには関数のグローバル (それが定義されたモジュール) への明示的な参照が含まれているのに対し、コード オブジェクトにはコンテキストが含まれていないことです。また、デフォルトの引数値は、コード オブジェクトではなく関数オブジェクトに格納されます (実行時に計算された値を表すため)。関数オブジェクトとは異なり、コード オブジェクトは不変であり、変更可能なオブジェクトへの (直接的または間接的な) 参照を含みません。

于 2011-04-24T04:51:22.720 に答える