はじめに
PEP8はimportに際し、次の順番でimportしろと規定している。
import文 は次の順番でグループ化すべきです:
1.標準ライブラリ
2.サードパーティに関連するもの
3.ローカルな アプリケーション/ライブラリ に特有のもの
普通はこの通り書けば何の問題もないと思われるだろうし、実際ほとんどの場合は問題ないのだが、たまにセンスを疑うようなimportを見かけることもある。
そこで、「俺コーディング規約」をまとめておく。この「俺コーディング規約」は、著者が3年くらいpythonと付き合いながら勝手に生まれてきたものである。別に他人に強要はしないし、「ここはこうした方が妥当なんじゃね?」とか言われてもかえって困るが、何かの参考にでもしてほしい。
目次
- はじめに
- 先に結論を言うと、PEP8には従った上で、
- 標準ライブラリをimportする順番
- サードパーティ製ライブラリをimportする順番
- ローカルな アプリケーション/ライブラリ に特有のものをimportする順番
- 結論
スポンサーリンク
先に結論を言うと、PEP8には従った上で、
- 「格」の高いものを先に並べる
- できるだけ文字数の昇順で並べる
- 「import」は先、 「from」は後
だいたいこの3つを守れば、そこそこは綺麗になります。ただし、「格」の判断は個人の主観に依存するので、たまに宗教戦争みたいになるかも。
標準ライブラリをimportする順番
標準ライブラリを「格」が高い順に並べると、
os > sys >> re, math,あたり >> |越えられない壁| >> itertools, collections, multiprocessing, ...
だいたいこんな順番になると思います。あと、この場合、osやsysは丸ごとimportする人が多いですが、collections丸ごとインポートする人とかいないと思うので(みんなほぼほぼdefaultdictしか使ってないイメージ)、2番目の原則に従うことで自然と「格」の低いライブラリが下の方に来て違和感が少なくなります。
議論の余地
- 「gc」とか「warnings」はsysの次に格が高いのでは?
↑ぶっちゃけ使わないのでセーフ
- 「datetime」はreあたりと同格では?
↑その気になればreで書けるからもっと下という考え方も
- 「glob」もreあたりと(ry
↑その気になれば(ry
- せんせー、「sqlite3」は「電池」に入りますか? 「tkinter」は? 「zlib」とかは?
↑標準ライブラリにDBまで入ってるの冷静に考えると頭おかしいと思う
- 「pickle」はどこ?
↑どこだろうね・・・
- 「webbrowser」とかいかにも格が低そうだし、サードパーティと一緒に書いてもバレないのでは?
↑何者なのか知らなくて調べたら、systemのwebブラウザを開くためだけに存在するっぽい。sysのラッパーみたいなものか。こんなの使う奴いるのかと思ったがネット上に日本語の解説記事もあるし、jupyterをコマンドラインから起動するときとかに地味に活躍しているのかもしれない。確認してないけど
サードパーティ製ライブラリをimportする順番
これも標準ライブラリと同様に考えると、
numpy > scipy > sklearn, keras, matplotlib, seaborn, ...
こんな感じかなぁ。かなりデータ分析系に偏った内容になっています。djangoでwebアプリ作る人はまずnumpyをimportしないだろうし。
なお、numpyはas np、scipyはscかsp、seabornはsnsといった風に省略してimportすることが普通ですが、これ(モジュールのトップレベルをimportして小文字の省略形にする)をやるライブラリは「格」が高いと思って間違いありません。
だからって、「じゃあfrom matplotlib import pyplot as pltはimport seaborn as snsより格上なのか」とか言われても困るんですが。
議論の余地
- scipyは正直言って丸ごとimportしなくても良いよね。statsだけ入れとくとか、ヘタしたらstatsの中の関数1個か2個importするだけで良い気がする
↑趣味の問題だよね・・・numpyはみんな迷わず丸ごとimportするのに
- ライブラリの中身の「格」に迷う。sklearn.decomposition.PCAとsklearn.ensemble.RandomForestClassifieとsklearn.metrics.precision_recall_fscore_supportはどんな順番で書いたらいいのかみたいな
↑とりあえず意味的に近いものを近くにまとめよう
- gensimとnltkはやっぱりnltkが上なのか?
↑更に日本語やるときはMeCabの位置まで絡んでくる
- お便利系外部ライブラリ(「parse」とか「progressbar2」とか)は格が高いのか、低いのか
↑そういう系はそういう系でまとめて分けた方が良いと思う
ローカルな アプリケーション/ライブラリ に特有のものをimportする順番
好きに書け。
結論
まとめようと思ったらかえって混沌としただけだった。ある程度きれいなら、どう書いても良い、としか言いようがないのかも。