Lightweight Language Lovers
Pythonで可変変数
- ある変数の値を使って目的の変数を表すことを、可変変数と読んでいるようです。
% perl -e '$var1="var2"; $var2="Value of var2"; print "$$var1\n"' Value of var2 %
記号を使うと簡潔に表現でき、嫌われがちな記号にも良い面があることが分かります。 - Python でこれを実現するにはどうすれば良いでしょうか? 具体的な例として、「年齢」という引数を受け取って、「年齢別件数」という名前の辞書を生成して返す場合を考えてみます。マニュアルを調べたり、インターネットを検索しても難解な解説ばかりで、インスタントな実現方法を見つけることが出来ませんでした。そこで代用となるやり方を考えて見ました。
- まず、変数の値を変数名として評価し、値を展開するには、evalを使うのが簡単だと思います。
1 var1 = 'var2' 2 var2 = 'Value of var2' 3 eval(var1) 4 'Value of var2'
- ただ、これだと代入文の左辺では使えません。多少乱暴ですが、
1 arg = 'nenrei' 2 exec('dict_' + arg + ' = {}') 3 print dict_nenrei 4 {}
- でも良く考えてみると本当に必要なのは、「ある名前に対応するオブジェクトを作成」することです。これは辞書そのものです。
1 counter = {} 2 arg = 'nenrei' 3 counter[arg] = {} 4 print counter['nenrei'] 5 {}
- 確かに一番最初の書き方は簡潔で洗練されているように感じます。しかし、簡潔な分、$が一つ無くなっただけで全然意味が違ってきてバグの元ですし、「これは便利」と説明性を考えずに安易に使ってしまいがちです。後の書き方は稚拙なのかも知れませんが、とても「堅牢」な感じがしますし、真の要件が析出された感じがします。
この「堅牢である」という感覚、COBOL+メインフレームで育った人間特有の感覚かも知れません。(それとも私だけか・・・)命令文の書ける桁等も決まっていて、特にIF文では最後のピリオド1つで意味が大きく違ってしまうような言語を使っていると、すべて大文字で厳格なコーディング規約に従った図形的に整然としたソースを見ると何故か安心するのです。英小文字や{}が多い最近のコードを「軟弱」と感じてしまうのです。
- 私達は、ある言語で使える機能が他の言語に無いと、その言語は劣っていると感じてしまいがちですが、大切なのは、「可変変数がある」ことではなく、「実現したいことが出来る」ことです。
- 私は今回の例を通じて、言語のデザインとして、「何が出来ないか」も、とても大切な要素だと感じました。次世代Python (Python 3000)の計画では、組み込み関数から除外される関数もあるそうです。Pythonは使っていて、あっと驚くことが無く、感覚として「理にかなっている」と感じることが多いのは、こんな風に慎重にデザインされていることに理由があるのかも知れません。