Python Language
Pythonのソースコードとバイトコードへのアクセス
サーチ…
関数のバイトコードを表示する
PythonインタプリタはPythonの仮想マシン上でコードを実行する前にコードをバイトコードにコンパイルします(Pythonのバイトコードとは?
Python関数のバイトコードを表示する方法は次のとおりです
import dis
def fib(n):
if n <= 2: return 1
return fib(n-1) + fib(n-2)
# Display the disassembled bytecode of the function.
dis.dis(fib)
disモジュールの関数dis.dis
は、渡された関数の逆コンパイルされたバイトコードを返します 。
関数のコードオブジェクトの探索
CPythonでは、関数オブジェクトのコードオブジェクトにアクセスできます。
__code__
オブジェクトには、関数の生のバイトコード( co_code
)と、定数や変数名などのその他の情報が含まれています。
def fib(n):
if n <= 2: return 1
return fib(n-1) + fib(n-2)
dir(fib.__code__)
def fib(n):
if n <= 2: return 1
return fib(n-1) + fib(n-2)
dir(fib.__code__)
オブジェクトのソースコードを表示する
組み込みではないオブジェクト
Pythonオブジェクトのソースコードを出力するにはinspect
使います。これは組み込みオブジェクトや対話的に定義されたオブジェクトに対しては機能しません。これらについては、後で説明する他の方法が必要です。
random
モジュールからメソッドrandint
ソースコードを出力する方法はrandint
です。
import random
import inspect
print(inspect.getsource(random.randint))
# Output:
# def randint(self, a, b):
# """Return random integer in range [a, b], including both end points.
# """
#
# return self.randrange(a, b+1)
ドキュメント文字列を印刷するだけです
print(inspect.getdoc(random.randint))
# Output:
# Return random integer in range [a, b], including both end points.
random.randint
メソッドが定義されているファイルのフルパスを出力します。
print(inspect.getfile(random.randint))
# c:\Python35\lib\random.py
print(random.randint.__code__.co_filename) # equivalent to the above
# c:\Python35\lib\random.py
インタラクティブに定義されたオブジェクト
オブジェクトがインタラクティブに定義されている場合、 inspect
はソースコードを提供できませんが、代わりにdill.source.getsource
を使用できます
# define a new function in the interactive shell
def add(a, b):
return a + b
print(add.__code__.co_filename) # Output: <stdin>
import dill
print dill.source.getsource(add)
# def add(a, b):
return a + b
組み込みオブジェクト
Pythonの組み込み関数のソースコードはcで書かれており、Pythonのソースコード( Mercurialでホストされているか、 https: //www.python.org/downloads/source/からダウンロード可能)を見ることによってのみアクセスできます。
print(inspect.getsource(sorted)) # raises a TypeError
type(sorted) # <class 'builtin_function_or_method'>
Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow