▶ 自作関数の作り方の基本については以下の記事をどうぞ
はじめに
今回はラッパー関数について基本から解説します。関数を包み込む関数をラッパー(Wrapper)関数といいます。関数を包み込む外側の関数を作って、中の関数を隠すような構造になります。まずラッパー関数がどのようなときに使われるのかをアック人して、実際に作ってみることにしましょう。
ラッパー(Wrapper)関数
どのようなときに使うか?
仕様変更に強くするためにラッパー関数を作ることがあります。通常、関数の仕様変更があった場合、その関数が呼び出されている箇所に影響が及び修正が必要となります。よく使われる関数を内部に持つラッパー関数を作っておくと、中の関数が変更になっても影響範囲が小さいというメリットがあります。
使いやすくするためにラッパー関数を作る、ということもあります。たとえば、パラメータの多い関数があるとします。ただ、通常利用する場合は特定のパラメータしか使わない、といったケースです。このようなときにはラッパー関数を作って、必要なパラメータを限定することで使いやすくするのです。
ラッパー関数を作ってみる
具体的な例を見ることで理解が深まると思います。実際にやってみましょう。まず一つ関数を定義します。
# 自己紹介する関数の定義
def self_introduce(name, age, country, zoo):
return '私は{}です。{}生まれでは{}歳です。{}にいます。'.format(name,country,age,zoo)
この関数は自己紹介をする関数で、パラメータとしてname, age, country, zooがあります。使ってみましょう。
self_introduce('らくだ', 32, '日本', '上野動物園')
ちゃんと動きますね。日本生まれで上野動物園にいるどうぶつたちの集まりがあったとします。countryが「日本」で動物園が「上野動物園」であることがわかっています。そんな時にいちいち引数を指定するのは面倒ですよね。こういうときは次のようなラッパー関数を作ると使いやすくなります。
# ラッパー関数の定義
def wrapped_introduce_limited(name, age):
country = '日本'
zoo = '上野動物園'
return self_introduce(name, age, country, zoo)
この関数を呼び出してみましょう。必要なパラメータはnameとageのみです。
# ラッパー関数の呼び出し
wrapped_introduce_limited('らくだ',32)
このように指定できるパラメータを限定してラッパー関数を作って、ラッパー関数内で内部関数に必要なパラメータを指定することができます。
また、次のような使い方もできます。
# ラッパー関数の定義
def wrapped_introduce(args):
return self_introduce(*args)
ラッパー関数では引数argsが1つとなっています。name, age, country, zooを指定したタプルを渡すと、*argsはタプルをunpackするので、これをself_introduceに渡して実行されます。
# ラッパー関数の呼び出し
camel = ('らくだ', 32, '日本', '上野動物園')
wrapped_introduce(camel)
うまく動きました。このようなラッパー関数を作っておくと、タプルのリストを渡して次のような処理をすることができます。
# タプルのリスト(どうぶつたちの情報)
animal_list=[('らくだ',32,'日本','上野動物園'),
('ねこ',28,'日本','上野動物園'),
('しまうま',38,'アフリカ','宇都宮動物園'),
('いるか',21,'オーストラリア','八景島シーパラダイス')]
introduction_list=[]
for arg in animal_list:
introduction_list.append(wrapped_introduce(arg))
introduction_list
ラッパー関数でパラメータを1つにしているためこのような処理ができます。さらにリスト内包表記を使うと、次のような簡単なコードになります。
# リスト内包表記で処理をする
[wrapped_introduce(arg) for arg in animal_list]
▶ リスト内包表記の基本については以下の記事をご覧ください。
まとめ
今回はラッパー関数について基本から解説を行いました。ラッパー関数は関数を包み込んで、中の関数を隠した構造の関数です。主な利用用途としては「仕様変更に強くする」「使いやすくする」です。関数の用途を限定的にしてパラメータを減らしたり、パラメータをまとめてタプルの形式で渡せるようにして使いやすくすることもできます。
コメント