2009-04-22 13 views
9

重複メソッド定義のソースコードを取得するためにこれを使用することができます。..Pythonの反射 - 私はの


Iメソッド定義が成功している完全に実行されていますが、実行時に変更したいと考えています。例えばのための

:私はメソッドを持っている場合は

def sayHello(): 
    print "Hello" 

タイプ(のsayHelloは)私の答え 'タイプの機能' を提供します。この関数オブジェクトのソースコード文字列を取得できますか?それはセキュリティ上の問題と考えられていますか?

+3

import inspect myobj = MyModel() print inspect.getsource(myobj.my_method) 

は続きを読みます。重複:http://stackoverflow.com/questions/427453/how-can-i-get-the-code-of-python-function; http://stackoverflow.com/questions/334851/print-the-code-which-defined-a-lambda-function; http://stackoverflow.com/questions/399991/python-how-do-you-get-python-to-write-down-the-code-of-a-function-it-has-in-memo –

+0

It's Pythonあなたはすでにソースを持っています。 –

+3

詳細をもう一度お尋ねすることを強くお勧めします。あなたが本当にやりたがっているのは、クロージャー/デコレータが必要なのかもしれないが、あなたが尋ねたのは、ソースコードを印刷していて(何とかそれを修正しようとしている)、あなたは失望しているということです。 –

答えて

2

sayHello.func_code.co_codeは、メソッドのコンパイル済みコードが含まれていると思われる文字列を返します。 Pythonはコードを内部で仮想マシンのバイトコードにコンパイルするので、これはすべて残っている可能性があります。

あなたはしかし、それを分解することができます

import dis 

def sayHello(): 
    print "hello" 

dis.dis(sayHello) 

この版画:

 
    1   0 LOAD_CONST    1 ('hello') 
       3 PRINT_ITEM 
       4 PRINT_NEWLINE 
       5 LOAD_CONST    0 (None) 
       8 RETURN_VALUE 

は、デコンパイラの Decompyleを見てください。

0

関数のソースコードを取得する組み込み関数はありませんが、ソースコード(Python/libディレクトリにあります)にアクセスできる場合は、自分でビルドすることができます。

17

は検査モジュールを使用します。

import inspect 
import mymodule 
print inspect.getsource(mymodule.sayHello) 

機能は、インポートモジュールで定義されている必要があります。