isortを使って並び替えた際にflake8でimportエラーが出てしまった場合の対処法について紹介します!
isortを並び替えたらエラーになった
pythonでパッケージを利用する際にisortを利用するのは必須です。
isortのインストール方法はこちらをご覧ください。
しかし、isortを利用することで困ることがあります。
isortで並び替えると自作パッケージを読む時に困る
自作のファイルを読むなどの場合にimport順番によって読み込めなくなることがあるためです。
今回は、PEP8にしたがってisortをしても適切な処理になるような工夫をご紹介します。
実際の例で見ていきましょう。
フォルダ構成は以下のようにしています。
app.py
test
└ test_app.py
isortする前の状態です。
自作パッケージを読む際にsysを使って、相対パスで読みたい時が出てきます。
# -*- coding: utf-8 -*-
import os
import sys
import unittest
sys.path.append(os.pardir)
import app as common
しかし、このtest_app.pyをisortをかけると
# -*- coding: utf-8 -*-
import os
import sys
import unittest
import app as common
sys.path.append(os.pardir)
sys.path…が最下部に行ってしまい、import appが読めなくなる可能性が出てきました。
これは困る。
isortのエラー解消方法は、参照用のファイルを作成する
pathmagic.pyをtest配下に追加。
app.py
test
├ test_app.py
└ _pathmagic.py
パスを読み込む部分を_pathmagic.pyに退避します。
ポイント:_pathmagic.pyにアンダースコアをつけてあげることで、app.pyよりisortで並び替えても先頭に来るようになります。
# -*- coding: utf-8 -*-
import os
import sys
sys.path.append(os.pardir)
元々、参照していた部分を消し、pathmagic.pyを読み込む処理を追加してあげます。
# -*- coding: utf-8 -*-
import _pathmagic # noqa
import unittest
import app as common
これで、isortに準拠しつつ、パッケージが読み込めるようになりました。
# noqaをつけるとインポートしたパッケージが利用されていなくても警告を出ません。
忘れるとunusedで怒られます。
たったこれだけの工夫ですが、非常に重要なテクニックです。
他の方法もあるようですが、私はこの方法が簡単なので多用しています。
みなさんもいろんな方法を試してみてください!