本記事では、Pythonでobjectが呼び出し可能か判定する方法を解説します。組み込み関数のcallableをすると簡単に判定できるため、その使い方を説明します。
呼び出し可能とは
Pythonでは、関数のように()を付けて実行(呼び出し)できるオブジェクトを「呼び出し可能」と呼びます。具体的には、以下のようなものが該当します。
- 関数やlambda式など
- クラス(インスタンス化に()を使うため)
- __call__メソッドを実装したインスタンス
これらは()を付けて呼び出せるため、callableを使うとTrueが返ります。一方、単なる文字列や__call__メソッドを実装していないインスタンスなどは呼び出し不可とみなされ、callableがFalseとなります。
callableの基本的な使い方
構文
callableの基本的な構文は次のとおりです。
引数に与えたobjectが呼び出し可能かどうかをTrueまたはFalseで返します。
callable(object)
例
以下の例では、さまざまなobjectタイプに対してcallableを試し、それぞれ簡単に解説しています。
関数
関数はデフォルトで呼び出し可能なオブジェクトです。
def sample_function():
print("Hello")
print(callable(sample_function)) # True(関数は呼び出し可能)
lambda式
lambda式も同様に呼び出し可能なオブジェクトとなります。
lambda_func = lambda: print("This is a lambda")
print(callable(lambda_func)) # True(lambda式も呼び出し可能)
クラス
クラスはインスタンス化のために呼び出されるので、呼び出し可能(True)と判定されます。
class SampleClass:
pass
print(callable(SampleClass)) # True(クラスも呼び出し可能)
クラスのインスタンス(呼び出し不可)
クラスのインスタンスは__call__メソッドを実装していない限り呼び出し不可(False)です。
sample_instance = SampleClass()
print(callable(sample_instance)) # False(インスタンスには__call__が未定義)
__call__メソッドを実装したクラス
__call__メソッドを定義すると、インスタンス自身を関数のように呼び出せるため、Trueになります。
class CallableClass:
def __call__(self):
print("I'm callable!")
callable_instance = CallableClass()
print(callable(callable_instance)) # True(__call__メソッドを定義)
注意点
- 関数やクラスのように見えても、内部で__call__メソッドを実装していない場合は呼び出し可能とは限りません。
- __call__メソッドを実装しているインスタンスは関数と同様に呼び出すことができるため、callableはTrueを返します。
- callableは実際にobjectを呼び出すわけではなく、「呼び出せるかどうか」を調べるためのものです。実際の呼び出し時にエラーが起こる可能性は別途考慮する必要があります。
まとめ
本記事では、Pythonの組み込み関数callableを使用して、objectが呼び出し可能かどうかを判定する方法を解説しました。関数やクラス、__call__メソッドを実装したインスタンスなどは呼び出し可能なobjectとしてTrueが返されます。コードの可読性やエラー回避のためにも、objectが呼び出し可能かどうかを確認したい場合にはcallableの活用を検討してみてください。