この記事では、Pythonで関数のオーバーロードを実装する方法を解説します。
C++ や C# のようには定義できませんが functools
モジュール を使うことで Python でもオーバーロードを実装することができます。
オーバーロードとは、引数が異なる同じ名前の関数を定義することです。
以下のコードは、異なる型の引数を受け取る同じ名前の関数を定義し、呼び出していますが、後に定義した関数しか呼び出せません。
def func(text: str):
print(f'text: {text}')
def func(num: int):
print(f'num: {num}')
func('abc')
# num: abc
func(10)
# num: 10
このようなコードに functools
モジュールを用いることで、渡された引数の型によって呼び出す関数を変更させることができます。
それでは、オーバーロードする方法を見ていきましょう!
オーバーロードの実装方法
Pythonでオーバーロードを実装するには、functools
モジュールのsingledispatch
デコレーターを使って、
from functools import singledispatch
以下の手順で定義します。
-
STEP1基準となる関数の定義基準となる関数に
singledispatch
デコレーターを付けます。関数名はここでは func にしておきます。@singledispatch def func(引数): # 何らかの処理
-
STEP2他の関数を登録次に、オーバーロード実装を追加します。
この関数にもデコレーターを修飾させますが
singledispatch
デコレーター を付けた関数から呼び出したregister
デコレーター を付けます。関数名はアンダースコアにしましたが func関数 と同じでなければなんでも良いです。@func.register def _(引数): # 何らかの処理
singledispatch
デコレーター は、1つ目の引数の型で呼び出す関数を決めています。なので、1つ目の引数の型がわかるように定義しなければなりません。型アノテーションを定義してある場合は、自動的に推測されます。
@func.register def _(num: int): # 何らかの処理
型アノテーションを定義してない場合は、
register
デコレーターに型を指定する必要があります。@func.register(int) def _(num): # 何らかの処理
試しに最初のコードをオーバーロードしてみましょう!
from functools import singledispatch
@singledispatch
def func(text: str):
print(f'text: {text}')
@func.register
def _(num: int):
print(f'num: {num}')
func('abc')
# text: abc
func(10)
# num: 10
このように、引数に渡した値の型によって呼び出す関数を変更することができました。
まとめ
この記事では、Pythonでオーバーロードを定義する方法を解説しました。
functools
モジュールのsingledispatch
デコレーターを使う- オーバーロードする関数には引数が1つ以上必要
@関数名.register
で、他の関数を登録- 型アノテーションから型を推測してくれる
- 1つ目の引数の型で分岐
同じような名前の関数を複数定義する際に使用すると、名前を考える労力を削れて良いかもしれませんね!
それでは今回の内容はここまでです!ではまたどこかで〜( ・∀・)ノ