pythonのflake8について
解決済
回答 3
投稿
- 評価
- クリップ 0
- VIEW 4,020
lib/__init.py
"""moduleA."""
from moduleA import ModuleA
__all__ = ("ModuleA")
lib/moduleA.py
class ModuleA(object):
"""hogehoge"""
上記に対して、
$ flake8 lib/init.py
を行うと、
lib/__init__.py:2:1: F401 'moduleA.ModuleA' imported but unused
と指摘されます。
この場合、どのように修正すれば良いのでしょうか??
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
+3
あるいは
__all__ = [ModuleA.__name__]
のようにするとか
追記:
質問タイトルから乖離した回答だったので、補足です。この方法はflake8の警告を消す方法ではなくて、文字列リテラルを避ける方法です。以下の理由は私個人のもので、一般的ではありません。
文字列リテラルを避けたい
どんな言語でも文字列リテラルの中身が正しいかどうかは検証できないので、もし簡単に文字列リテラルの使用を避けられるのなら避ける、というのが私個人のやり方です。名前空間をもつオブジェクトが文字列リテラルでなくて__name__
で参照されれば、flake8でも検証できます。ただ、flake8で警告が抑止されるのは結果であって、そのために文字列リテラルを避けてるのではありません。flake8を使わなくとも文字列リテラルはなるべく避ける、それだけです(例えば可能な場合はdictよりもnamedtupleを使う、など)。
importに対するnoqaを避けたい
もう一つの理由はF401を抑止する#noqaがイケてないと思っているからです。他の#noqaはその行に対する警告を抑止します。抑止したい警告はその行にあるので、もしその行を編集して、警告が出ない状態になれば#noqaコメントを消します。#noqaが抑止している警告はその行に依存してる、と言うことができます。視覚的にはとても近いので普通は気付けます。
一方、importのF401に対する#noqaはソースコードのその行以下全部に依存しています。ソースコードに変更が入ってF401警告が出ない状態になったときに、import部分まで戻って#noqaを消す、という手順になります。これは視覚の範囲外であることが多いので、編集している人の頭に頼ったやりかたです。時間が空いたり、チームで作業していたりしてこれを忘れると、1.不要になった#noqaを消し忘れる、2.本当に使っていないのに#noqaで抑止されている、の2つケースに陥ります。
そもそも、importに対する#noqaをやらなければこんなことは考えなくていい、そしてimportに対する#noqaが必要になる理由は、文字列リテラルを列挙する形で__all__
を定義しているからだ、というのが私の回答の背景でした(過去形)。
真実
ここまで書いておいて、こんな結末はないだろという感じもしますが、質問者さんの__all__
の値は「文字列のタプル」ではなくてただの「文字列」になっています。
__all__ = ("ModuleA") # -> == "ABC" 誤
__all__ = ("ModuleA",) # -> 正
ちゃんとタプルかリストにすればflake8(ver 3.3.0)はimportされたものが使われている、と認識してくれるようです。
これを最初に指摘できなくてごめんなさい・・・。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
+3
2つの方法があります。
__init__.py
でimprotするのをやめましょう。from moduleA import ModuleA # NOQA
としましょう
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
(投稿ミスです。削除します)
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.09%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2017/02/23 23:48
`__all__` かどうかに関係なく、 `__init__.py` の中で `ModuleA.__name__` が何かの変数に代入されかたら、 `unused` 警告がでなくなった現象なので、 `x = ModuleA.__name__` と書いても同様な効果は得られます。「importしたけど使ってない、という警告がいやなら適当な変数に代入しましょう」ということを意図した回答でしょうか?
2017/02/24 14:31
__all__は質問文にあるのでxとは違います。__all__ = ["ModuleA"]よりも__all__ = [ModuleA.__name__]の方が、例えば__all__ = ["ModuelA"]のような凡ミスの可能性が無いので安全です(だから常にそうしろ、とまでは主張してませんよ)。
要は私の回答はflake8の云々はどうでもいい、重視していない、という立場です(私個人が使っていない、という意味ではありません)。shimizukawaさんが違和感を感じるとしたらこの前提の違いでしょう。私が回答したのは、これがflake8を黙らせつつ凡ミスの可能性もない方法だからです。
私はドリルが欲しいという客に必ずドリルを買わせなければならないとは思いません。個別的な回答が一般的にはベストじゃない場合がある、ということも受け入れられます。どうしてもドリル(flake8)のマニュアルに拘りたいのなら、#noqaがいいでしょうね。
2017/02/24 21:39
違和感を感じたのは、__all__ = [ModuleA.__name__]という書き方を今まで見たことがなく、トリッキーに感じたところにありますが、たしかに、__all__に設定したいのだ、という前提に立つとsharowさんの回答に同意できます。個人的な好みとしては、NOQAを明示する方を採用しますが、意図が分かりましたのでどちらがより一般的に良いか、についての主張はとくにありません。
2017/02/25 09:15
2017/03/08 10:29