2012-08-14 14 views
19

Pracuję więc nad projektem w Pythonie i staram się go utrzymywać zgodnie ze standardami pylint i ogólnie. Tak, mam plik źródłowy (My właśnie nazwać a.py)"Nieużywane ostrzeżenie o imporcie" i pylint

#a.py 
import loggingsetup 

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

Ale chcę, aby kontrolować, co rejestrowanie wygląda, więc w loggingsetup mam coś takiego:

#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 

Teraz wydaje się działać poprawnie. Przypuszczam, że jako pytanie wstępne powinienem zapytać, czy jest to właściwa droga, czy też istnieje inny sposób strukturyzacji mojego kodu, który byłby lepszy.

Ale moim głównym pytaniem jest to, że gdy uruchamiam pylint na a.py, pojawia się ostrzeżenie typu "nieużywany import - importuj zestaw logów", ponieważ nie wywołuję żadnych metod ani funkcji z zestawu logów.

Mogę zrobić coś jak przedefiniować ciało z funkcją logowania jako funkcję i zadzwonić, ale wydaje się to głupie i podatne na błędy (musiałbym się martwić dwukrotnym wywołaniem, jeśli importowałem zestaw z innego źródła, i jeśli rozumiem, jak Python obsługuje import, to nie jest problem z moją obecną konfiguracją).

Oczywiście mogłem po prostu powiedzieć pylintowi, żeby zignorował ostrzeżenie, ale pomyślałem, że najpierw zapytam tutaj, aby upewnić się, że to nie jest coś, co powinienem potraktować inaczej.

+11

Importowanie moduł tylko dla jego skutków ubocznych czuje się źle ze mną. To sprawia, że ​​intencja twojego kodu jest trudniejsza do rozpoznania. Jawny jest lepszy niż niejawny. –

+0

To tylko ostrzeżenie, że możesz zapomnieć o czymś i/lub robić coś niepotrzebnego. Zignoruj ​​to, jeśli tak nie jest. – martineau

+1

Nie zgadzam się z powyższym sentymentem z Martineau. Tak, czasami tak to się dzieje i musisz zignorować ostrzeżenia, ale zazwyczaj ostrzeżenia nie powinny być traktowane jako "przyjazne przypomnienia" i ignorowane bez pewności, dlatego przyszedłem, aby upewnić się, że mogę to zignorować, lub uzyskać lepsze podejście. – Retsam

Odpowiedz

9

Podejście, którego chciałbym użyć, to użycie loggingsetup jako rodzaju opakowania dla logging.

import logging 

# set up logging config here 

from logging import * 

Następnie w innych modułach Państwo:

import loggingsetup as logging 

Może chcesz użyć nazwy innej niż loggingsetup w tym przypadku, na przykład tweaked_logging lub logging_with_my_settings.

+0

Z punktu widzenia mojego oryginalnego ostrzeżenia, to działa i zdecydowanie podoba mi się ten pomysł. Teraz mam pylintę narzekającą na import symboli wieloznacznych i cały nieużywany import w loggingsetup.py (chociaż skorzystałem z twojej rady i zmieniłem jej nazwę) – Retsam

+0

Ah, pylint ...: -/ – kindall

+0

Nie próbowałem tego, ale Wstawianie '# pylint: disable-msg-cat =' komentarz u góry modułu wrappera powinien pozwolić ci wyłączyć określone kategorie ostrzeżeń tylko w tym module. Przynajmniej wyizolowałeś wszystkie "zło" do jednego modułu. :-) – kindall

2

Twój kod powinien być w funkcji o nazwie raz w głównym skrypcie

2

Jak wspomniałem sam owijając go w funkcji i wywołanie konfiguracji wyraźnie by rozwiązać to ostrzeżenie. I jak wspomniał Steven, byłby to lepszy kod, ponieważ jest bardziej jednoznaczny o tym, co robisz.

Jeśli martwisz się dwukrotnym wywołaniem tej funkcji, możesz oczywiście użyć flagi internowania modułu, aby umożliwić wykonanie funkcji tylko raz.

__initialized = False 

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

Dobrze, i to by działało, ale nie mogę nie myśleć, że to rodzaj poświęceń "Prostota jest lepsza niż złożona", aby zrobić to w ten sposób. Nie byłoby to zawijanie treści skryptu, ale musiałbym również pamiętać o dodaniu wywołania funkcji do dowolnego importu. Nie straszne, ale nie tak proste. Byłby to dobry wybór w niektórych przypadkach, ale w tym przypadku myślę, że odpowiedź ogólna jest lepsza. – Retsam

23

W takich przypadkach można jeszcze jednoznacznie powiedzieć pylint, że niewykorzystane import w celu:

import loggingsetup # pylint: disable=unused-import 

Wskazówka dyspozycja jest na tej samej linii co importu tak W0611 jest wyłączona tylko dla tej linii , a nie dla całego bloku poniżej.

8

Jeśli używasz pylintiflake8 można zignorować ostrzeżenie niewykorzystane import w obu narzędzi w ten sposób:

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

Wygląda na to, że potrzebujesz * dwóch spacji * przed początkiem "drugiego komentarza": '# noqa # pylint: disable = unused-import' –

Powiązane problemy