目次
はじめに
今回はPython PEP8に書かれているimportについての記事になります。
きっかけ
コードレビューをしていただいた際に、PEP8に沿ったコードを書くことを指摘されたからです。
ドキュメントに沿ってコードを書いていくため
理解をし、知識を落とし込むための記事になります。
コードは書くよりも読まれることの方が多い
PEP8とは
Python の標準ライブラリに含まれているPythonコードのコーディング規約
https://pep8-ja.readthedocs.io/ja/latest/#
例えば、コメントアウトは 『#』 で行う、関数の宣言は 『def』 であるなど
基本的なこと や 可読性を上げる ために必要なことなどが記されています。
import 記述方法1
import文は、通常は行を分けてかくべき
# Correct:
import os
import sys
# Wrong:
import sys, os
# Correct:
from subprocess import Popen, PIPE
こちらは subprocessモジュールからコンポーネントやクラス、定数、関数などを呼び出しているためOK
import 記述方法2
import文 は次の順番でグループ化すべき
標準ライブラリ
サードパーティに関連するもの
ローカルな アプリケーション/ライブラリ に特有のもの
上のグループそれぞれの間には、1行空白を置くべき
標準ライブラリ
- 組み込み関数や定数のこと
# 例1
import datetime
now = datetime.datetime.now()
# 例2
print("Hello world")
サードパーティに関連するもの
- 標準ライブラリに含まれていないもの
- インストールが必要なもの
例1
pip install pandas
import pandas as pd
df = pd.DataFrame()
ローカルな アプリケーション/ライブラリ に特有のもの
- 自らが作成したモジュール
project/
├── packages/
│ ├── send_mail.py
│ └── get_datas.py
├── main.py
└── README.md
import send_mail
import 記述方法3
絶対import を推奨します。なぜなら、絶対import の方が通常は読みやすく、importシステムが正しく設定されなかった(たとえばパッケージ内部のディレクトリが sys.path で終わっていた) 場合でも、より良い振る舞いをする(または少なくともより良いエラーメッセージを出す)からです:
import mypkg.sibling
from mypkg import sibling
from mypkg.sibling import example
しかしながら、明示的に相対importを使うことが許される場合があります。特に絶対importを使うと不必要に冗長になる複雑なパッケージレイアウトを扱う場合です。
from . import sibling
from .sibling import example
推奨していることもありますが、
きっかけにも書いた通り、コードはたくさんの方に読まれるため、
常に絶対importで書くほうが良いと思います。
import 記述方法4
クラスを含んだモジュールからクラスをimportする場合
from myclass import MyClass
from foo.bar.yourclass import YourClass
上記のやり方で名前の衝突が起きるらしい。
その場合下記のimport宣言する
import myclass
import foo.bar.yourclass
使用する際、"myclass.MyClass" や "foo.bar.yourclass.YourClass"
と記述する
import 記述方法5
ワイルドカードを使った import (from import *) は避けるべきです。なぜなら、どの名前が名前空間に存在しているかをわかりにくくし、コードの読み手や多くのツールを混乱させるからです。ワイルドカードを使った import を正当化できるユースケースがひとつあります。内部インターフェイスを公開APIとして再公開する場合 (たとえば、Pure Python の実装をオプションの高速化モジュールの内容で上書きし、どの定義が上書きされるかがあらかじめわからない場合) です。
こちらも可読性の向上の観点からみると、そだね。と感じた。
終わりに
今までコード作成に必死で可読性など意識したことがなかった。
PEP8を読んで、意識変えていこうと思います!
間違った認識があれば、ご指摘お願い致します。