2

次の形式のコード(簡単に変更できない)があります。

def foo(x):
   do_other_stuff_that_I_do_not_want_to_do()
   def bar():
      "do something"
      str(x)
   bar()

bar()Pythonシェルから直接呼び出したいと思います。co_globals、または他の内部ビットを使用してもかまいません。これは不可能かもしれないと私は感じています。それは...ですか?

4

1 に答える 1

4

あなたが述べたように、コードで内部関数オブジェクトを取得することdef不可能です-前述のオブジェクトは、外部関数が実行されたとき(つまり、呼び出されたとき)にのみ(ステートメントによって)作成されます。

余談ですが、のような外部関数は、内部関数を結果として(たとえば、に変更して)最後の行として返すfooようにコーディングされていることが多く、正確には「関数ファクトリ」(多くの場合「クロージャファクトリ」)として機能することに注意してください。内部関数の存在そのものを、一種のプライベートで秘密の実装の詳細として保持します。ただし、コーディングでは代わりに後者のルートを選択します。bar()return bar

編集...:

ただし、内部関数のコードオブジェクトを取得すること可能です。

>>> def outer():
...   def inner(): return 'boo'
...   print inner()
... 
>>> eval(outer.func_code.co_consts[1])
'boo'
>>> 

ただし、一般に、コードオブジェクトを呼び出し可能な関数にするには、かなりの作業が必要です(この特別な場合はeval、内部関数に引数や非ローカル変数がないため十分ですが、もちろん、一般的な場合にさえ近いわけではありません。 。非ローカルのバインディングなどの優れた機能を提供する必要があります!-)

于 2010-09-18T05:20:36.410 に答える