Lispを書いてると、他の言語でもapplyを使いたくなる。

そしてPythonにもapplyがあったので早速喜んで使ってたら引数の数がおかしいというエラーメッセージに困らされた。

基本的なapplyの使い方

`

def hoge(word):
    print word

apply(hoge,"A")

`

とまあこんな感じ使うわけです。

文字列を引数にできない。

ところがこの引数の”A”を”ABC”に変えるだけでエラーになる。

`

Traceback (most recent call last):
  File "", line 9, in 
TypeError: hoge() takes exactly 1 argument (3 given)

`

どうやら文字列を渡すと文字数分だけの引数を渡したと解釈されてしまうらしい。

解決策

さて、解決方法ですがタイトルにもあるように廃止された関数なのでもう使っちゃダメらしい。

引数 function は呼び出しができるオブジェクト (ユーザ定義 および組み込みの関数またはメソッド、またはクラスオブジェクト) でなければなりません。args はシーケンス型でなくてはなりません。 function は引数リスト args を使って呼び出されます; 引数の数はタプルの長さになります。オプションの引数 keywords を与える場合、 keywords は文字列のキーを持つ辞書で なければなりません。これは引数リストの最後に追加されるキーワード 引数です。 apply() の呼び出しは、単なる function(args) の呼び出しとは異なります。 というのは、apply() の場合、引数は常に一つだから です。*apply() は function(*args, *keywords) を 使うのと等価です。 上のような “拡張された関数呼び出し構文” は apply() と全く等価なので、必ずしも apply() を使う必要はありません。

リリース 2.3 で撤廃されました。 上で述べられたような拡張呼び出し構文を使って ください。

自分にはよくわからないですが

applyでやりたいことは function(*args, **keywords) で全部できるから applyは使うな。

ということのようです。

“Python Apply”をキーワードにしてGoogle検索しても「使ってはいけない」という情報がぱっと出て来なかったのでこの記事を書きました。よくわからないエラーで困ってる誰かの参考になれば幸いです。

参考

2.2 非必須組み込み関数 (Non-essential Built-in Functions)
http://docs.python.jp/2.5/lib/non-essential-built-in-funcs.html