過去の日記

2015-09-07 [長年日記]

使っていないimport文が勝手に消されてしまうのを回避する [Python]

「importしていること」が必要で「importされたもの」を全然使っていない文があった。

Flaskの起動スクリプトが

from app import app
import views

if __name__ == '__main__':
    app.run()

ってなったのだけど、この import views がそう。
このviews.pyにルーティングが書いてあるのでこのimportは消せない。

消せないけどPyCharmはここが使ってないぞ! というWarningになった。
これでうっかり PyCharm で optimize import してしまうと消えてしまう。困った。いや。困らないけど気持ち悪い。


解決は2つあって

from app import app
import views

__all__ = ['views']

if __name__ == '__main__':
    app.run()

とする。
from xxx import *
した時にインポートされる要素を明示するための記法。これを流用する。

もうひとつは、

from app import app
# noinspection PyUnresolvedReferences
import views

if __name__ == '__main__':
    app.run()

として、インスペクションを抑止するコメント行を書く。
説明と中身が合っていないような気がするが多分私の理解不足だろう。


おきまりで書いてた

if __name__ == '__main__':
    reload(sys)
    sys.setdefaultencoding("utf-8")

なんかも

if __name__ == '__main__':
    reload(sys)
    # noinspection PyUnresolvedReferences
    sys.setdefaultencoding("utf-8")

と書いて抑止できた。


これ、便利っぽいので検索したら書けるかもしれないマークアップの一覧を見つけたのでメモ。

PyCharm suppress inspections list


メモ

def archive_note(pk):
    try:
        note = Note.get(Note.id == pk)
    except Note.DoesNotExist:
        abort(404)
    # noinspection PyUnboundLocalVariable
    note.archived = True
    note.save()
    return jsonify({'success': True})

abort(404) が適切に例外を再raiseする(ハズな)のでtryの下に到達しないのだけど、PyCharmはそれが分からずに「Noteが初期化されてないかもしれないぞ」と言ってくる。tryの上に note = None とか意味ない(=意図をコメント残しておかないといけないような)文を入れて抑止するよりもこれの方がいいかも。