ツナワタリマイライフ

日常ネタから技術ネタ、音楽ネタまで何でも書きます。

スマートPythonプログラミングでPython入門するよ!

はじめに

OpenStackというOSSの開発・保守をやっていました。(もうすぐ仕事変わる)Python書けないマンがコード読んでバグ探すって終わってるよね〜〜〜あああ〜〜〜Pythonやっときゃよかったな〜〜〜と言うと友人が「知人が書いた本が!」ということで乗っかりました。

blog.amedama.jp

その瞬間に読めるのが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というスタイルを使え。

目を通して頭にいれておいたほうが良さそうですね。

www.lifewithpython.com

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章ということでここまで!続きもモリモリ読んでいきます。入門してないので都度調べていこうと思います。