ソースに絡まるエスカルゴ

貧弱プログラマの外部記憶装置です。

【python】関数の引数として関数を渡す

 pythonを書いていて関数の引数として関数を渡したい時が出てきたので調べたところ、できるようだったので今回はその備忘録になります。


 では、始めます。


1:関数の引数として関数を渡す方法
 やり方は簡単で、以下のように引数として関数名を指定するだけです。

#-*- coding:utf-8 -*-
# 引数で渡したい関数
def called_func():
    print("called_func")

# 引数の関数を実行する関数
def call_func(func):
    func()

# 引数に関数を渡して実行
call_func(called_func)

 やり方がわかったので実際に簡単なサンプルソースを動かしてみます。


2:サンプルソース
 以下のソースコードを実行してみてください。

・sample.py

#-*- coding:utf-8 -*-
def add(a, b):
    return a + b

def multiply(a, b):
    return a * b

# 引数の関数を実行して結果を表示する関数
def run_func_print(func, a, b):
    print(func(a, b))

def main():
    run_func_print(add, 1, 2)
    run_func_print(add, 8, 9)

    run_func_print(multiply, 1, 2)
    run_func_print(multiply, 8, 9)

if __name__ == '__main__':
    main()

 実行するとちゃんと引数の関数が実行されていることがわかると思います。


3:注意すべき点
 引数に関数を渡せることを知っていれば便利だとは思いますが、注意すべきところがあります。

 例えば以下のソースコードを実行するとエラーになります。

・sample2.py

#-*- coding:utf-8 -*-
def add2(a, b, c):
    return a + b + c

def run_func_print(func, a, b):
    print(func(a, b))

def main():
    run_func_print(add2, 1, 2)

if __name__ == '__main__':
    main()

 これは引数として渡した関数(add2)の引数は3つであるのに、実行する関数(run_func_print)では引数を2つしか渡していないためにエラーとなっています。

 このように引数に関数を渡した場合、渡す関数の引数に何らかの変更があるとその影響をそのまま受けるため、引数の関数を実行する関数にも修正が必要となります。

 関数同士がかなり密接に影響し合うため、注意していないとバグやエラーを出してしまうことになります。


 以上がpythonで関数の引数として関数を渡す方法になります。

 個人で開発する場合には裏技的な感じで使用するのもアリかもしれないですが、チームや仕事としてやる場合にはバグを誘発したりメンテナンス性や可読性が著しく下がると思うのでやらない方が良いかと個人的には思います。

 そもそも関数を渡して処理させるような設計にしない方がよほど重要だと思います。


・参考資料