実務で、Javaとphpによる開発を10年行っていましたが、Python & Djangoに乗り換えて1年が経ちました。
最初は色々と混乱しましたが、1年を越えて、やっとそれなりのレベルになったと思うので、ここらあたりで、個人的に感じたメリットをメモします。
■ステキな点
shellがステキ
これに尽きる。めっちゃ便利です。
↓こんな感じで起動。Pythonのソースがコマンドライン上で入力可能になります。
$ python manage.py shell --settings=settings/master.py Python 2.7.9 (default, Apr 17 2015, 08:52:42) [GCC 4.4.7 20120313 (Red Hat 4.4.7-11)] on linux2 Type "help", "copyright", "credits" or "license" for more information. (InteractiveConsole) >>>
例えば、本番サーバにsshログインしてshellを起動。
自作のクラスを実行することにより、本番データを使用した結果を確認できちゃいます。
>>> from module.player import Player >>> player = Player.get(id=1000) >>> print player.name テスト太郎
テスト用のファイルを作って → gitにpushして → 本番にこわごわdeployして → コマンドラインから実行してー
といった手間なし。sshログイン出来ればOKです。
Virtualenvがステキ
Python実行環境を構築するにあたり、ライブラリの仮想環境を作れます。
例えば、複数のプロジェクトで開発している場合、pythonのバージョンが違ったりしますが、Virtualenvwrapperと合わせて導入すれば、workonコマンド1つで切り替え可能です。
$ workon project1 # ↓ (project1用の仮想環境に切り替わった) (project1)$ python -V Python 2.7.9 # pythonのバージョンは2.7.9 (project1)$ workon project2 # ↓ (project2用の仮想環境に切り替わった) (project2)$ python -V Python 2.6.5 # pythonのバージョンは2.6.5
[参考]
Python – Virtualenvwrapperの導入 – Quiita
ライブラリの充実ぶりがステキ(pipとかAnsibleとかFablicとかLocustとか)
開発&運用を行うあたり、必要となる作業に対するライブラリが充実しています。
- pip
pythonパッケージを管理するツールです。
Djangoもパッケージ化されているので、以下のコマンドでインストール可能です。$ pip install Django
[参考]
pipインストールページ(英語) - Ansible
環境構築を行うツールです。
Vagrantと合わせることにより、VirtualBoxでの環境作成を自動化できます。[参考]
Ansibleチュートリアル - Fablic
コマンドライン上から、python関数を実行するツールです。
テストサーバや本番サーバへのデプロイ時に使用すると便利です。 - Locust
pythonで記述したテストシナリオで負荷をかけるツールです。
pythonが書ければOK。JMeterのように使い方に慣れる必要がありません。
また、プロジェクト言語もpythonの場合、資産の流用が可能です。[参考]
Locustサイト(英語)
コーディング規約が定石化されている
PEP8というコーディング規約が、絶対的存在として普及しているので、比較的、人によるコーディングの差異が発生しにくいです。
準拠していないコードでプルリクエストすると、ゴミのように扱われます…
[参考]
PEP8 日本語訳
コードを自動で整形する、autopep8というツールもあり、規約に慣れるまでは使うと便利です。
[参考]
autopep8サイト(英語)
■個人的に厳しかった点
そして、デメリットとまでは言えませんが、個人的に厳しかった点もメモ。
英語が読めないと厳しい
お世辞にも「日本で普及している」とは言えないので、ちょっと複雑なことをググると、英語のサイトに突入します。
まぁでも、追い込まれた状態で調べることが多いので、必死に読むから英語の勉強になります。(大事)
パフォーマンスを考慮したコーディングが独特
これは全ての言語に言えることではありますが、pythonは特に独特な文化があるなと思いました。
特に内包表記。これを知らずに開発してプルリクエストすると、ゴミのように扱われます…
test_ids = [test.id for test in Test.get_all() if test.is_enable]
[参考]
このサイトを見つけたことにより、一気に理解を深めました。
PythonSpeed/PerformanceTips – Python Wiki(英語)
3つあるメソッドの違いに混乱
インスタンスメソッド・クラスメソッド・スタティックメソッドの3種類があり、それぞれなんなのか混乱しました。
class Test(object): # インスタンスメソッド def method_instance(self): print "インスタンスメソッドだよ" # クラスメソッド @classmethod def method_class(cls): print "クラスメソッドだよ" # スタティックメソッド @staticmethod def method_static(): print "スタティックメソッドだよ"
実行例はこんな感じ。
>>> # インスタンスメソッド実行 >>> test = Test() >>> test.method_instance() インスタンスメソッドだよ >>> # クラスメソッド実行 >>> Test.method_class() クラスメソッドだよ >>> # スタティックメソッド実行 >>> Test.method_static() スタティックメソッドだよ
Javaなどには存在しないクラスメソッドというものが、スタティックメソッドと似ていて混乱します。(少なくとも、実行側からは見分けがつかない)
また、IDE(PyCharm)で開発していると、インスタンスメソッド内で引数selfを使用していないと、似ているクラスメソッドではなく、スタティックメソッドへの修正を促してくるので、初心者は更に混乱します。
[参考]
具体的な違いはこちらが分かりやすかったです。ここの内容を読んで、上の謎は全て解消しました。
インスタンスメソッド・クラスメソッド・スタティックメソッド – PASL