研修をかねて社内のシステムをpythonのフレームワークdjangoを使って書いてみています。djangoは、「ruby on rails」と並んで有名なWebアプリのフレームワークです。
フレームワークの学習ってコストが高くつくので、本格的なものはRailsくらいしか使って試したことはないのだけど、確かに定型的なプログラムには便利です。
結構自由度が高くて、よくあるフォーム入力の画面なんかも、全部システムにお任せから、テンプレートだけプログラマが書く場合、全部プログラムする場合など、柔軟な仕組みになっています。
まあ、非定型的な部分は結局人間が書くしかないので、ここは生産性の向上は見込めませんが、定型部分なら、シコシコとコードで書くより2~3倍くらい生産性が上がりそうです。
実際上記のようなフォームを生成するのに、以下のようなコードを書くだけです。重要なのは、7行目のmodel=Itemの部分と、exclude=xxxxxの部分で、どのモデル(テーブル)に対する編集画面かを指定し、excludeで入力しない項目を指定しています。
このフォームをas_p()メソッドとか、as_table()メソッドとかで出力すると、そのまま、htmlコードが出力されます。
また、formオブジェクトをテンプレートに渡して、「{{form.name}}」のような形で組み込むと、その位置にその項目に応じた、入力フィールドが生成されます。
- from django import forms
- from item.models import Item
- class EditItemForm(forms.ModelForm):
- # フォームの設定
- class Meta:
- model = Item
- exclude = ('dt_create','dt_update')
- widgets = {
- "comment": forms.Textarea(attrs={'rows':5}),
- }
一方で、特に言語としてはpythonはかなり変わった仕様をして他の言語から移行するとかなり戸惑う部分もあります。慣れると便利な部分もあるのですが、釈然としないものも多々あります。
(1) 範囲の指定が特異
以下のようなコードがあった場合の結果はどうなるでしょうか?
- for x in range(10,20):
- print A
普通の感覚なら、10から20までの数字が表示されと思うのが一般的です。 しかしこのコードの結果は、10から19までの数字を表示します。この方法は、違和感がありますが、使い勝手はいいです。
(2) 関数とメソッドとどちらにあるのか釈然としない。
PHPならすべてが、関数なので、処理の内容から区分を探すことになります。Rubyなら逆にすべてがメソッドなので、どの要素を主体に考えるとかで、操作対象になるオブジェクトのメソッドを探せば、よいのですがpythonは、関数で存在するかメソッドで存在するか判然としません。
たとえば、文字列の長さを取得するには、phpならstrlen()関数ですし、rubyなら、length()メソッドです。pythonは、len()関数になります。
一方文字列を小文字化するには、phpならstrtolower()関数で、rubyは、downcaseメソッドです。pythonは、今度は、lower()メソッドです。
- print len("ABCD")
- print "ABCD".lower()
(3) 多様性は悪か?
私が基本Rubyが好きなのですが、そのベースにある多様性は善という思想なのです。どちらかと言うとpythonは多様性は悪であるという思想のようです。その点では、pythonという言語はちょっとpascalに似ているような気がします。
とりあえず、一本くらいシステムを完成させてから最終的な評価をしましょうか
yna