関数のコードを表示する
Python のプログラムを作成しているときに、ある関数のソースコードを確認したくなったときは、inspect
モジュールの getsource
関数を使用して簡単に調べることができます。
次の例では、Python の対話型シェル(python3
コマンド)を起動して、os.path.abspath
関数の実装コードを確認しています。
>>> import inspect
>>> import os
>>> print(inspect.getsource(os.path.abspath))
def abspath(path):
"""Return an absolute path."""
path = os.fspath(path)
if not isabs(path):
if isinstance(path, bytes):
cwd = os.getcwdb()
else:
cwd = os.getcwd()
path = join(cwd, path)
return normpath(path)
(おまけ)シェルスクリプト化しておく
次のようなシェルスクリプト (pycode
) を作っておくと、Python の関数の実装コードを簡単に確認できるようになります。
このシェルスクリプトは、PATH の通ったディレクトリに置いて、chmod +x pycode
で実行権限を付けておきます。
#!/bin/bash
#
# pycode - Python の関数やクラスの実装コードを表示します
#
# Usage:
# $ pycode <モジュール名> <関数名|クラス名>
#
# 使用例:
# $ pycode os path.abspath
#
# 引数の数を確認
if [ "$#" -ne 2 ]; then
echo "Usage: $(basename $0) <モジュール名> <関数名|クラス名>"
exit -1
fi
# 引数からモジュール名と関数名を取得
module_name="$1"
function_name="$2"
# 関数のコードを表示するための Python コード
python_code=$(cat <<END
import $module_name
import inspect
try:
function_code = inspect.getsource($module_name.$function_name)
print(function_code)
except (ImportError, AttributeError):
print(f"シンボルが見つかりません: {module_name}.{function_name}")
END
)
# Python コマンドを実行して関数のコードを表示
python3 -c "$python_code"
例えば、os
モジュールの path.abspath
関数のコードを確認するには次のように実行します。
$ pycode os path.abspath
関数が定義されているファイル全体を表示する
inspect.getsource
関数でモジュール名を指定すれば、そのモジュール全体のコードを取得することができるのですが、ハイライト表示なしで長いコードが表示されると非常に読みにくいです。
ここでは、モジュールが定義されているファイルそのものをテキストエディタで開く方法を紹介します。
inspect.getfile
関数を使用すると、指定したクラス、関数、オブジェクトなどが定義されているファイルのパスを取得することができます。
>>> import inspect
>>> import os
>>> inspect.getfile(os)
'C:\\Python35\\lib\\os.py'
あとは、そのファイルを任意のエディタで開けば OK です。
エディタの実行ファイルにパスが通っているのであれば、os.system
関数を使って、そのエディタでさくっと開くことができます。
>>> import inspect
>>> import os
>>> os.system('gvim ' + inspect.getfile(os))