関数属性の調査
Python では、関数は第一級オブジェクトとみなされます。これはどういう意味でしょうか?実世界には本やペンなど、さまざまな種類のオブジェクトがあるのと同じように、Python では関数もオブジェクトであり、他のオブジェクトと同様に独自の属性を持っています。これらの属性は、関数の名前、定義場所、実装方法など、関数に関する多くの有用な情報を提供します。
Python の対話型シェルを開いて調査を始めましょう。このシェルは、Python コードをすぐに書いて実行できるプレイグラウンドのようなものです。これを行うには、まずプロジェクトディレクトリに移動してから、Python インタープリターを起動します。ターミナルで実行するコマンドは次のとおりです。
cd ~/project
python3
Python の対話型シェルに入ったので、簡単な関数を定義しましょう。この関数は 2 つの数値を受け取り、それらを足し合わせます。定義方法は次のとおりです。
def add(x, y):
'Adds two things'
return x + y
このコードでは、add
という名前の関数を作成しました。この関数は 2 つのパラメータ x
と y
を受け取り、それらの合計を返します。文字列 'Adds two things'
はドキュメント文字列 (docstring) と呼ばれ、関数の機能を記述するために使用されます。
dir() を使用した関数属性の調査
Python の dir()
関数は便利なツールです。この関数を使用すると、オブジェクトが持つすべての属性とメソッドのリストを取得できます。add
関数が持つ属性を確認するために、この関数を使用してみましょう。Python の対話型シェルで次のコードを実行します。
dir(add)
このコードを実行すると、長い属性のリストが表示されます。出力の例は次のとおりです。
['__annotations__', '__call__', '__class__', '__closure__', '__code__', '__defaults__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__get__', '__getattribute__', '__globals__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__kwdefaults__', '__le__', '__lt__', '__module__', '__name__', '__ne__', '__new__', '__qualname__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']
このリストは、add
関数に関連付けられたすべての属性とメソッドを示しています。
基本的な関数情報の取得
では、いくつかの基本的な関数属性に注目してみましょう。これらの属性は、関数に関する重要な情報を提供します。Python の対話型シェルで次のコードを実行します。
print(add.__name__)
print(add.__module__)
print(add.__doc__)
このコードを実行すると、次の出力が表示されます。
add
__main__
Adds two things
これらの属性がそれぞれ何を意味するかを理解しましょう。
__name__
: この属性は関数の名前を返します。この場合、関数の名前は add
です。
__module__
: この属性は関数が定義されているモジュールを示します。対話型シェルでコードを実行する場合、モジュールは通常 __main__
です。
__doc__
: これは関数のドキュメント文字列 (docstring) で、関数の機能を簡潔に説明します。
関数コードの調査
関数の __code__
属性は非常に興味深いものです。この属性には、関数の実装方法に関する情報が含まれており、バイトコードやその他の詳細が含まれます。この属性から何がわかるか見てみましょう。Python の対話型シェルで次のコードを実行します。
print(add.__code__.co_varnames)
print(add.__code__.co_argcount)
出力は次のとおりです。
('x', 'y')
2
これらの属性が示す内容は次のとおりです。
co_varnames
: これは関数で使用されるすべてのローカル変数の名前を含むタプルです。add
関数では、ローカル変数は x
と y
です。
co_argcount
: この属性は関数が期待する引数の数を示します。add
関数は 2 つの引数を期待するため、値は 2 です。
__code__
オブジェクトの他の属性を調査したい場合は、再度 dir()
関数を使用できます。次のコードを実行します。
dir(add.__code__)
これにより、関数の実装方法に関する低レベルの詳細が含まれるコードオブジェクトのすべての属性が表示されます。