Python & Djangoを使って感じたステキな点


実務で、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関数を実行するツールです。
    テストサーバや本番サーバへのデプロイ時に使用すると便利です。

    [参考]
    今日からすぐに使えるデプロイ・システム管理ツール Fabric 入門

  • 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

  • このエントリーをはてなブックマークに追加