質問: pythonで処理の分岐をおこなうときに、ディクショナリを使ってみたいと思っています。 たとえば以下のような処理があるとします。 ``` var=数値 if var==1: //処理1 elif var==2: //処理2 elif var==3: //処理3 elif var==4: //処理4 ``` これを ``` dic={ 1:処理1の関数, 2:処理2の関数, 3:処理3の関数, 4:処理4の関数 } var=数値 dic[var]() ``` という風にしたいです。 この際、処理が十分短い場合には、 ``` dic[1]=lambda 処理1 ``` という書き方をしたい気がします。 ただ、PEPでは、lambdaの変数への代入は推奨されていないと聞きます。 そこで質問なのですが、 1上記のようにlambdaを使うことは、やはり控えるべきでしょうか。 2その場合、どのように書くのが適切でしょうか(defで定義した上で代入するのでしょうか) 3lambdaを代入すべきでない実質的な理由はなんでしょうか。 以上よろしくお願いいたします。
回答: PEP8の当該箇所から引用しておきます。 > > ラムダ式を直接識別子に結びつける代入文を書くのではなくて、常に def 文を使いましょう。 > > > 良い: > > > def f(x): return 2*x > > 悪い: > > > f = lambda x: 2*x > > はじめの書き方は、結果として生成される関数オブジェクトの名前が、ラムダではなくて f であると明示的に述べています。これは traceback や文字列表現を使うときに役立ちます。代入文を使うと、ラムダ式が提供できる唯一の利点(つまり、大きな式に埋め込めること)を消してしまいます。 > > > はじめに — pep8-ja 1.0 ドキュメント PEP8のルールが今回のようなケースに当てはまるかは微妙でしょう(代入せず直接辞書の中にlambdaを書いてしまえば良い)。辞書を作るのは確かに理にかなっています。 ただし、if-elif-elseで書いていくのと比べると、elseに対応するものがないので、気を配る必要があります(~~キー有無判定を入れる、setdefaultを使う、defaultdictを使う、存在しないキーは絶対に来ないロジックだと割り切る等・・・)。~~ ~~そうするとごちゃごちゃしてくるので、けっきょくif-elif-elseを連ねるのと大差ないコードの見通しになりそうです。~~ `dict.get(key, default_function)`で良いです。puroko3様ご指摘ありがとうございます。これだとそれなりにすっきりするので、if-elif-elseを書き連ねるのと比べてアドバンテージがありそうです。