サーチ…


関数のバイトコードを表示する

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