コーディングを行うにあたり,個人的に最も重要と考えているのは「開発環境」です.
個人的に必須な項目は,
- インテリセンス
- コーディング規約(命名規則など)
- コード整形
- 静的解析ツール
- 単体テストツール
です.
プラスαで,「コンテナ(Docker)環境」などが使用できるとより良いと思います.
昔はEmacsでべた書きしてましたが,
今はまともな開発環境なしに作業する気になりません...
Python環境構築
インストール
Python2はすでにサポート終了しているため,Python3を使うべきです.
パッケージ管理(aptやyum)でインストールする場合,Pythonバージョンを明示しない場合(apt install python
など)でバージョンがOSに依存するため注意が必要です.
Python3をインストールする場合は,下記のように明示的なバージョンをインストールをします.
apt install python3 python3-pip
ライブラリ管理には,pip(Python Package Index)を使用します.
ここからどのようなライブラリが用意されているか確認できます.
pip --version
pip 20.3.4 from /usr/lib/python3/dist-packages/pip (python 3.9)
venvの推奨
venvはPythonの仮想環境です.pipをたくさんすると環境依存が複雑になることを防ぎます.コンテナのようなイメージです.
python3 -m venv <env_name>
<env_name>は任意の名前です.この名前のディレクトリが作成されるため,.
を先頭に付けて隠しファイルとすると良いでしょう.
仮想環境の開始
source <env_name>/bin/activate
仮想環境の終了
deactivate
VSCode + venv
デフォルトでは,VSCodeでvenv環境を読み込まないため,インテリセンスがインテリセンスやコード解析がうまく動作しません.
下記の設定をsettings.json
を記述することで,venv環境を読み込むことが可能になります.
"python.python.defaultInterpreterPath": "/path/to/your_venv",
コーディング規約
Pythonのコーディング規約として,PEP8が最も有名です.
必ずしもPEP8を採用する必要はありませんが,なんらかのコーディング規約は制定すべきです.
一例ですが,PEP8では命名規則は下記のように決められています.
対象 | 命名規則 |
---|---|
クラス名 | CapWords |
関数名 | lower_case |
変数名 | lower_case |
定数名 | UPPER_CASE |
コード整形
コード整形には,autopep8を使用します.
python3 -m pip install autopep8
静的解析ツール
Linterとして”Pylint”と”Flake8″が有名です.今回はFlake8を使用する方法を示します.
Flake8の導入
flake8が導入済みかどうかを確認します.
pip show flake8
WARNING: Package(s) not found: flake8
pip install flake8
でインストールします.
pip install flake8
導入すると下記のように表示されます.
pip show flake8
Name: flake8
Version: 4.0.1
Summary: the modular source code checker: pep8 pyflakes and co
Home-page: https://github.com/pycqa/flake8
Author: Tarek Ziade
Author-email: tarek@ziade.org
License: MIT
Location: /usr/local/lib/python3.9/dist-packages
Requires: mccabe, pyflakes, pycodestyle
Required-by:
Flake8の設定ファイル
ファイル名は,.flake8
,setup.cfg
,tox.ini
とし,プロジェクトのルートディレクトリに置きます.
グローバルな設定にしたい場合は,${HOME}/.config/
配下に置くこともできます.
https://flake8.pycqa.org/en/latest/user/configuration.html
[flake8]
ignore=E402, D203
exclude = .git,__pycache__,docs/source/conf.py,old,build,dist
max-line-length=100
max-complexity=10
Flake8の使い方
適当にコードを用意します.
def main():
print("test")
if __name__ == '__main__':
main()
下記コマンドで,Flake8を適用しコードを解析します.
「def main()
の後に空行が1行しかないため,2行にしなさい」というエラーになりました.これは,PEP8のコーディング規約に則ったものです.
flake8 main.py
main.py:4:1: E305 expected 2 blank lines after class or function definition, found 1
命名規則
flake8に命名規則のチェックも追加します.
pip install pep8-naming
naming: 0.13.0
が追加されます.これで,命名規則のチェックも可能になります.
flake8 --version
4.0.1 (mccabe: 0.6.1, naming: 0.13.0, pycodestyle: 2.8.0, pyflakes: 2.4.0)
CPython 3.7.3 on Linux
VSCodeでFlake8を適用する
まず,上記のようにpipなどでFlake8をインストールします.
設定画面を開き([左下の歯車]> [Settings])検索ボックスにpython.flake
を入力します.
[Python > Linting: Flake8 Enabled]をチェックするとFlake8が適用されます.
ユニットテスト
コードの保守性を確保するために,単体テスト(ユニットテスト)はほぼ必須です.
ユニットテストに関しては,”unittest”モジュールを使用します.
https://docs.python.org/ja/3/library/unittest.html
import unittest
class TestStringMethods(unittest.TestCase):
def test_upper(self):
self.assertEqual('foo'.upper(), 'FOO')
def test_isupper(self):
self.assertTrue('FOO'.isupper())
self.assertFalse('Foo'.isupper())
def test_split(self):
s = 'hello world'
self.assertEqual(s.split(), ['hello', 'world'])
# check that s.split fails when the separator is not a string
with self.assertRaises(TypeError):
s.split(2)
if __name__ == '__main__':
unittest.main()
python3 main.py
...
----------------------------------------------------------------------
Ran 3 tests in 0.000s
OK
python3 main.py -v
test_isupper (__main__.TestStringMethods) ... ok
test_split (__main__.TestStringMethods) ... ok
test_upper (__main__.TestStringMethods) ... ok
----------------------------------------------------------------------
Ran 3 tests in 0.000s
OK
ライブラリ管理
Pythonのライブラリは,pipにより管理されています.
マシンを変更した場合,どのライブラリがインストール済みかを確認する必要があります.
現在のpip環境をファイルに読み書きすることが可能です.これにより環境依存を簡単に低減することが出来ます.
・pip環境をファイルに書き出し
pip freeze > requirements.txt
・ファイルからpip環境のインストール
pip install -r requirements.txt