Python

【Python】引数が異なる関数を定義する方法【オーバーロード】

この記事では、Pythonで関数のオーバーロードを実装する方法を解説します。C++やC#のようには定義できませんが、Pythonでもオーバーロードを実装することができます。

オーバーロードとは、引数が異なる同じ名前の関数を定義することです。

Pythonでは、同じ名前の関数を複数定義することはできませんが、functoolsモジュールを使用することで関数をオーバーロードすることができます。

以下のコードは、異なる型の引数を受け取る同じ名前の関数を定義して呼び出していますが、後に定義した関数しか呼び出されません。

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モジュールを用いて、渡された引数の型によって呼び出す関数を変更することができます。

それでは、オーバーロードする方法を見ていきましょう!

オーバーロードの実装方法

オーバーロードを実装するには、functoolsモジュールのsingledispatchデコレーターを使って、

from functools import singledispatch

以下の手順で定義します。

  1. 基準となる関数の定義
  2. 他の関数を登録

1. 基準となる関数の定義

基準となる関数にsingledispatchデコレーターを付けます。関数名はここではfuncにしておきます。

@singledispatch
def func(引数):
    # 何らかの処理
オーバーロードするには、引数を1つ以上定義する必要があります

2. 他の関数を登録

次に、オーバーロード実装を追加します。

この関数にもデコレーターを修飾させますが、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つ目の引数の型で分岐

同じような名前の関数を複数定義する際に使用すると、名前を考える労力を削れて良いかもしれませんね!

それでは今回の内容はここまでです!ではまたどこかで〜( ・∀・)ノ

最短3か月でエンジニア転職「DMM WEBCAMP COMMIT」
なんと転職成功率98%!
今なら3日以内のカウンセリング枠を予約&参加で「1,000円分のAmazonギフト券」をプレゼント!