名前と値

以前「名札モデルと箱モデル」という考え方を知ったが、名前と値で考えてみると要は、1つの名前に対して複数の値を付け替えることが可能かどうかがポイントである。逆に1つの値に複数の名前を付けられるというのは両者とも同じ。


Pythonで値に関して考えてみる。値をプリミティブに持つとか箱で持つとか(値型or参照型)の持ち方でなく、値の種類に関して考えてみる。「数値、文字列などの基本的なもの」や「リストや辞書などのデータ構造的なもの」や「関数やクラスやモジュールなどの名前空間的なもの」がある。この中で関数に近いが、Pythonでは値としてブロックそのものを表現する方法がない


困るのは、if, elifである。例えば以下。

>>> s = 'a'
>>> if s == 'a':
...   print 1
... elif s == 'b':
...   print 2
... elif s == 'c':
...   print 3
...
>>> 

sの値で分岐して、ある処理をしたい。もう少し分かりやすく言うと、sの値で分岐して、ある複数の文を実行したい。嫌なのは、if, elifの分岐がもっと長くなって、しかも頻繁に呼び出す場合である。パフォーマンスが悪い。


複数の文を実行する部分を関数化し、辞書で分岐すれば良いではないかと思うかもしれない。それは1つの解決策ではある。しかし、複数の文の部分をベタ書きしたい。当然、lambda式は回避方法にならないのは言うまでもない。


しかし、そもそもこういった処理自体必要なのかと思うかもしれない。実は必要で、私は常套手段として__getattr__を利用して遅延処理を実現しているのだが、属性をif, elifで分岐して処理をしている。そこで必要になる。


追記:

遅延処理の実現にpropertyを利用する事も可能かもしれない。研究してみるかな。