はじめに
OpenStackというOSSの開発・保守をやっていました。(もうすぐ仕事変わる)Python書けないマンがコード読んでバグ探すって終わってるよね〜〜〜あああ〜〜〜Pythonやっときゃよかったな〜〜〜と言うと友人が「知人が書いた本が!」ということで乗っかりました。
スマートPythonプログラミング: Pythonのより良い書き方を学ぶ
- 作者: もみじあめ
- 発売日: 2016/03/12
- メディア: Kindle版
- この商品を含むブログを見る
その瞬間に読めるのがkindleのいいところ。早速読んでみます。あ、想定読者は入門書が終わったひと向けだけどすみません終わってないです。
環境構築
とりあえずPython2系であればCentOSデフォルトで入ってるよね。Vagrant up! 前Pythonでスクレイピングする用の環境を作ったのでそれを流用しました。
- playbook
--- - hosts: all become: yes tasks: - name: install yum package yum: name={{item}} with_items: - epel-release - python-pip - name: install pip package pip: name=beautifulsoup4
pythonのバージョン確認
[vagrant@smartpython ~]$ python --version Python 2.7.5
Vangrant hostupadapter
よりみちします。Vagrant VMのIP管理めんどくさくなってきたので、ホストの/etc/hostsを自動設定してくれるプラグインをいれましょう。
take@lenovo:~/work/vagrant/smartpython$ vagrant plugin install vagrant-hostsupdater Installing the 'vagrant-hostsupdater' plugin. This can take a few minutes... Installed the plugin 'vagrant-hostsupdater (1.0.2)'!
すばらしいね!
take@lenovo:~/work/vagrant/smartpython$ cat /etc/hosts 127.0.0.1 localhost 127.0.1.1 lenovo # The following lines are desirable for IPv6 capable hosts ::1 ip6-localhost ip6-loopback fe00::0 ip6-localnet ff00::0 ip6-mcastprefix ff02::1 ip6-allnodes ff02::2 ip6-allrouters 192.168.100.107 smartpython # VAGRANT: db0f9d0383fc4b4e329d6d27f1932c35 (default) / 33e65cb1-c50b-4f7f-bf70-a54f949b04dd
ハローワールド
めちゃくちゃまわりくどいですね、一度読んでもう一回戻りました。
[vagrant@smartpython ~]$ cat helloworld.py #! /usr/bin/env python # -*- coding: utf-8 -*- def main(): print('Helo, World!') if __name__ == '__main__': main()
実行するとこんな感じ。
[vagrant@smartpython ~]$ python helloworld.py Helo, World!
シバンとエンコーディングはいいでしょう。ただ、Python2系だけASCIIがデフォなのは覚えておいたほうが良さそうですね。非ASCII文字に関するバグ引いたことあったなぁ。。。
さてnameという特殊変数はスクリプト実行したときとモジュールとして読み込んだときで挙動が違うそうですね。
インタプリタからhelloworldをimportしてnameを表示してみます。
[vagrant@smartpython ~]$ python Python 2.7.5 (default, Nov 20 2015, 02:00:19) [GCC 4.8.5 20150623 (Red Hat 4.8.5-4)] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> import helloworld; >>> print(helloworld.__name__) helloworld
ふむ。アンダーバーなしですね。
スクリプト実行したときはnameにはmainが入るってのは決まりごとなんですかね?とりあえず覚えておきます。
環境構築
環境構築が先では?と思わなくもないですが、読み進めましょう。(targetが入門者じゃないから、ですね。)
正直pyenv使ってバージョン変える必要性をあまり感じないので今回はskipします。
pipはplaybookに書いたとおりで導入済みです。
Python仮想環境も、Vangrantで作って壊してが基本なので今は不要ですね。
読みやすいコードを書く
コーディングスタイル。
PEP8というスタイルを使え。
目を通して頭にいれておいたほうが良さそうですね。
pycodestyleとautopep8
pep8に従っているかを検出し、修正してくれるライブラリ。これはいれておこう。
[vagrant@smartpython ~]$ sudo pip install pycodestyle autopep8 You are using pip version 7.1.0, however version 8.1.2 is available. You should consider upgrading via the 'pip install --upgrade pip' command. Collecting pycodestyle Downloading pycodestyle-2.0.0-py2.py3-none-any.whl (42kB) 100% |████████████████████████████████| 45kB 1.0MB/s Collecting autopep8 Downloading autopep8-1.2.4-py2.py3-none-any.whl (41kB) 100% |████████████████████████████████| 45kB 2.7MB/s Collecting pep8>=1.5.7 (from autopep8) Downloading pep8-1.7.0-py2.py3-none-any.whl (41kB) 100% |████████████████████████████████| 45kB 2.3MB/s Installing collected packages: pycodestyle, pep8, autopep8 Successfully installed autopep8-1.2.4 pep8-1.7.0 pycodestyle-2.0.0
もちろんplaybookには足しておきます。
コラムにありましたが、OpenStackはhackingというflake8のプラグインを使っているんですね。著者はOpenStackに詳しいのかな?
アクセスレベル
private相当のメソッドには頭に_をつけるというのはソース見てればなんとなく分かるんですが、これって慣習なだけで縛ることはできないんですよね、そこがちょっと不思議。
命名規則
- lowercase
- lower_case_with_underscores
- UPPERCASE
- UPPER_CASE_WITH_UNDERSCORES
- CapitalizedWords
- mixedCase
- _single_leading_underscore
- __double_leading_underscore
- single_trailing_underscore_
- double_leading_and_trailing_underscore
名は体をあらわしてていい感じですね!
組み込み関数との重複を回避するために末尾にアンダースコアをつける例が書かれてますが、変数のscopeって全部グローバルなんですかね。。。(入門書を見ろって感じですね!)
ドキュメンテーション
docstringはrubyでいうところのrdocですかね。ダブルクォート3つで説明文が書かれているの、たしかによく見ます。
組み込み変数のhelpやdocでアクセスできるのイケてますね!
おわりに
今日ははじめに+前半2章ということでここまで!続きもモリモリ読んでいきます。入門してないので都度調べていこうと思います。