2012-08-14 78 views
19

因此,我正在使用Python進行一個項目,並試圖使用pylint來保持它的標準,並且一般情況下。所以,我有一個源文件,(我們會叫它a.py)「未使用的導入警告」和pylint

#a.py 
import loggingsetup 

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

但是,我想控制日誌記錄的樣子,所以在loggingsetup我有類似:

#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 

現在,這似乎工作正常。我想作爲一個初步問題,我應該問一下,如果這是正確的方式,或者如果我的代碼有不同的構建方式,那將是更可取的。

但我的主要問題是,當我在a.py上運行pylint時,我得到了一個像「未使用的導入 - 導入loggingsetup」的警告,因爲我實際上沒有從loggingsetup調用任何方法或函數。

我可以做一些事情,像重新定義一個函數的loggingsetup主體並調用它,但它似乎愚蠢和容易出錯(我不得不擔心調用它兩次,如果我從其他地方導入loggingsetup,並且如果我理解python如何處理導入,那對我當前的設置不是問題)。

我明顯可以告訴pylint忽略這個警告,但我想我會先問這裏,以確保這不是我應該處理的東西。

+11

導入一個模塊,只是它的副作用覺得我錯了。它讓你的代碼更難以辨別。顯式比隱式更好。 – 2012-08-14 16:59:16

+0

這只是一個警告,你可能已經忘記了一些事情和/或可能會做一些不必要的事情。如果情況並非如此,請忽略它。 – martineau 2012-08-14 17:58:38

+1

我有點不同意martineau的上述觀點。是的,有時候就是這樣,你不得不忽視警告,但通常警告不應該被視爲「友好的提醒」,並且被忽視而不被確定,這就是爲什麼我要麼確定我可以忽略它,要麼得到更好的方法。 – Retsam 2012-08-14 18:11:55

回答

9

我會使用的方法是使用loggingsetup作爲logging的一種包裝。

import loggingsetup as logging 

你可能想在這種情況下使用其他名稱超過loggingsetup,例如:

import logging 

# set up logging config here 

from logging import * 
在你的其他模塊,你

然後tweaked_logginglogging_with_my_settings

+0

從我原來的警告的角度來看,這是有效的,我絕對喜歡這個想法。現在我已經得到了pylint抱怨通配符導入以及loggingsetup.py中所有未使用的導入(儘管我接受了您的建議並重命名了它) – Retsam 2012-08-14 17:55:51

+0

啊,pylint ...: -/ – kindall 2012-08-14 17:58:47

+0

我沒有試過這個,但是在你的包裝模塊的頂部放置'#pylint:disable-msg-cat ='註釋應該讓你只在該模塊中禁止指定的警告類別。至少你已經將所有的「壞」都分離到了一個模塊中。 :-) – kindall 2012-08-23 22:00:41

2

你的代碼應該是在一個在主腳本

2

調用一次函數正如你所提到自己包裹它的功能和調用設置明確將解決此警告。正如史蒂文提到的那樣,這會被認爲是更好的代碼,因爲它更清楚你在做什麼。

如果您擔心兩次調用此函數,您當然可以使用模塊實習生標誌來允許只執行一次函數體。

__initialized = False 

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

好吧,這是可行的,但我不禁覺得這種做法「簡單勝於複雜」是一種犧牲。 它不會包裝腳本的主體,但我也必須記得將函數調用添加到任何導入。不可怕,但不是那麼簡單。 在某些情況下這將是一個不錯的選擇,但在這種情況下,我認爲kindall的答案是更好的選擇。 – Retsam 2012-08-14 17:41:15

23

在這種情況下,你仍然可以明確地告訴pylint的是,在此未使用的導入意:

import loggingsetup # pylint: disable=unused-import 

通知指令是在同一條線上的進口使W0611僅此行禁用,而不是下面的所有塊。

8

如果使用pylintflake8你可以通過這種方式忽略了這兩個工具未使用的導入警告:

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

看起來你需要在「第二條評論」開始之前有兩個空格*:#noqa#pylint:disable = unused-import' – 2018-02-13 02:50:27