2012-08-14 7 views
19

私はPythonでプロジェクトに取り組んでおり、pylintで一般的に標準に準拠させようとしています。"未使用のインポート警告"とpylint

#loggingsetup.py 
import logging 

logging.root.setLevel(logging.DEBUG) 

consoleOut = logging.StreamHandler() 
consoleOut.setLevel(logging.INFO) 
consoleOut.setFormatter(logging.Formatter("\t"+logging.BASIC_FORMAT)) 
logging.root.addHandler(consoleOut) 

#etc 
:だから、私はソースファイルを持って、私は私のようなものを持っているloggingsetupにおけるのでロギングは、どのように見えるかを制御したい、

#a.py 
import loggingsetup 

def foo(): 
    log.info("This is a log message") 

を(我々はそれをa.py呼ぶことにします)しかし、

今、これは問題なく動作しているようです。私は予備的な質問として、これが正しいかどうか、あるいは望ましいコードを構成する別の方法があるかどうかを尋ねるべきだと思います。

しかし私の主な質問は、私が実際にはloggingsetupから任意のメソッドや関数を呼び出すわけではないので、私はa.pyにpylintを実行すると "unused import - import loggingsetup"のような警告が出るということです。

私はloggingsetupの本体を関数として再定義して呼び出すことができますが、それは愚かでエラーが発生する可能性があります(別の場所からloggingsetupをインポートすると2回呼び出す心配があります。私がPythonがどのようにインポートを処理するかを理解していれば、それは私の現在の設定で問題にはなりません)。

私は明らかに警告を無視するようにpylintに伝えることができましたが、実際にはこれが実際には違った扱いをするべきではないことを最初に尋ねると思いました。

+11

は私には間違って感じています。それはあなたのコードの意図を分かりにくくします。明示的は暗黙的より優れています。 –

+0

何かを忘れてしまったり、不要なことをしているかもしれないという警告です。そうでない場合は無視してください。 – martineau

+1

私は上記のmartineauの感想には一種違う。はい、ときどきこれがどうなるのか、あなたは警告を無視しなければならないことがありますが、通常、警告は「フレンドリーな思い出」として扱われるべきではなく、無視されるべきではありません。より良いアプローチを得る。 – Retsam

答えて

9

私が使用するアプローチはloggingのラッパーの一種としてloggingsetupを使用することです。

あなたの他のモジュールで次に
import logging 

# set up logging config here 

from logging import * 

あなたは:

import loggingsetup as logging 

あなたは、例えば、この場合にはloggingsetup以外の名前を使用する場合がありますtweaked_loggingまたはlogging_with_my_settings。あなた自身が機能でそれをラップし、この警告を解決するだろう明示的に設定を呼び出す述べたように

+0

私の元の警告の観点から、それはうまくいきます。今では、ワイルドカードのインポートやloggingsetup.pyで使われていないすべてのインポートについて文句を言っています(あなたのアドバイスを取って名前を変更しましたが) – Retsam

+0

ああ、pylint ...: -/ – kindall

+0

私はこれを試しませんでした。あなたのラッパーモジュールの先頭にある '#pylint:disable-msg-cat ='コメントを置くと、そのモジュール内の警告の指​​定されたカテゴリーだけが表示されなくなります。少なくとも、すべての「悪さ」を1つのモジュールに分離しています。 :-) – kindall

2

あなたのコードは、メインスクリプト

2

に一度呼び出された関数にする必要があります。そして、スティーブンが言及したように、これはあなたがやっていることをより明確にしているので、より良いコードと考えられます。

この関数を2回呼び出すことを心配している場合は、module internフラグを使用して、関数本体の実行を1回だけ許可することができます。このような場合には

__initialized = False 

def init(): 
    if not __initialized: 
     __initialized = True 
     #DoStuff 
+0

そう、これはうまくいくだろうが、私は助けることはできないが、このようにするには「単純なものが複雑なものよりも良い」という犠牲を払っていると感じている。 スクリプトの本体をラップしているわけではありませんが、インポートに関数呼び出しを追加することも忘れてはなりません。恐ろしいことではありませんが、単純ではありません。 場合によっては良いオプションになりますが、このケースでは、kindallの答えが良いと思います。 – Retsam

23

、あなたはまだ明確では、この未使用のインポートが意図していることpylint伝えることができます:W0611のみ、このラインのために無効になっているので、

import loggingsetup # pylint: disable=unused-import 

お知らせ命令は、インポートと同じ行にあります、以下のすべてのブロックではありません。

8

あなたはpylintflake8を使用する場合は、この方法では、両方のツールで、未使用のインポートの警告を無視することができます。ちょうどその副作用のためにモジュールをインポートする

import loggingsetup # noqa # pylint: disable=unused-import 
+0

「2番目のコメント」の開始前に2つのスペース*が必要と思われる: '#noqa#pylint:disable = unused-import' –

関連する問題