Jak wyłączyć ostrzeżenie Pylint?

267

Próbuję wyłączyć ostrzeżenie C0321 („więcej niż jedna instrukcja w jednym wierszu” - często umieszczam ifinstrukcje z krótkimi wynikami w jednym wierszu w tym samym wierszu), w Pylint 0.21.1 (jeśli ma to znaczenie: astng 0.20. 1, wspólny 0.50.3, Python 2.6.6 (r266: 84292, 15 września 2010, 16:22:56)).

Próbowałem dodać disable=C0321plik konfiguracyjny Pylint, ale Pylint nalega na zgłoszenie go. Wariacje na tej linii (jak disable=0321lub disable=C321) są oznaczone jako błędy, więc pylint nie rozpoznaje opcji prawidłowo, to po prostu ignorowanie go.

Czy to błąd Pylint, czy robię coś złego? Czy jest na to jakiś sposób? Naprawdę chciałbym pozbyć się tego hałasu.

Head Geek
źródło
1
Jest tutaj dobre rozwiązanie, jeśli chcesz wyłączyć pojedynczy wiersz kodu, a nie wszystkie błędy.
Le Droid,

Odpowiedzi:

168

pylint --generate-rcfile pokazuje to tak:

[MESSAGES CONTROL]

# Enable the message, report, category or checker with the given id(s). You can
# either give multiple identifier separated by comma (,) or put this option
# multiple time.
#enable=

# Disable the message, report, category or checker with the given id(s). You
# can either give multiple identifier separated by comma (,) or put this option
# multiple time (only on the command line, not in the configuration file where
# it should appear only once).
#disable=

Wygląda więc na to, że ~/.pylintrcpowinieneś mieć disable=linię / sekcje wewnątrz sekcji [MESSAGES CONTROL].

Chris Morgan
źródło
1
Dzięki, ale już to robi, w sekcji [KONTROLA WIADOMOŚCI], jak pokazano powyżej. Nadal ignorowane.
Head Geek
6
@Head Geek: cóż, działa dla mnie. ~/.pylintrcz dwoma liniami [MESSAGES CONTROL]i disable=C0321. To zapobiega tej wiadomości.
Chris Morgan,
Dziwne ... dokładnie ta sama wersja PyLint?
Head Geek
@Head Geek: 0.21.3, astng 0.20.3 i common 0.52.1 faktycznie (najnowszy, kiedy go zainstalowałem, nowszy niż twój)
Chris Morgan
1
@Chris Morgan: Ah. Prawdopodobnie błąd, który został już naprawiony, a następnie - używam wersji z repozytorium Ubuntu. Dzięki!
Head Geek
165

Miałem ten problem przy użyciu Eclipse i rozwiązałem go w następujący sposób:

w folderze pylint (np. C:\Python26\Lib\site-packages\pylint) przytrzymaj klawisz Shift, kliknij prawym przyciskiem myszy i wybierz polecenie otwarcia systemu Windows w tym folderze. Rodzaj:

lint.py --generate-rcfile > standard.rc

Spowoduje to utworzenie standard.rcpliku konfiguracyjnego. Otwórz go w notatniku i poniżej [MESSAGES CONTROL], usuń komentarz disable=i dodaj identyfikatory wiadomości, które chcesz wyłączyć, np .:

disable=W0511, C0321

Zapisz plik i w Eclipse-> okno-> preferencje-> PyDev-> pylint, w polu argumentów wpisz:

--rcfile=C:\Python26\Lib\site-packages\pylint\standard.rc

Teraz powinno działać ...


Możesz także dodać komentarz na górze kodu, który zostanie zinterpretowany przez pylint:

# pylint: disable=C0321

link do wszystkich kodów wiadomości pylint


Dodanie np. --disable-ids=C0321W polu argumentów nie działa. Wszystkie dostępne wiadomości pylint są przechowywane w słowniku _messages, atrybucie wystąpienia pylint.utils.MessagesHandlerMixInklasy. Podczas uruchamiania pylint z argumentem --disable-ids=...(przynajmniej bez pliku konfiguracyjnego) ten słownik jest początkowo pusty, co powoduje powstanie wyjątku KeyError w pylint ( pylint.utils.MessagesHandlerMixIn.check_message_id(). W Eclipse możesz zobaczyć ten komunikat o błędzie w konsoli Pylint (Windows - pokaż widok - Konsola , wybierz konsolę Pylint z opcji konsoli oprócz ikony konsoli).

Remi
źródło
2
Nie, naprawdę nie powinno. 1) Odwołuje się do Eclipse, co nie ma znaczenia dla zadanego pytania. 2) Zaleca wyłączenie starszych kodów wiadomości. Poleciłbym moją odpowiedź za najprostsze rozwiązanie problemu lub odpowiedź Chrisa Johnsona, aby uzyskać więcej szczegółów.
imolit
153

Począwszy od wersji Pylint v. 0.25.3, możesz używać nazw symbolicznych do wyłączania ostrzeżeń, zamiast zapamiętywać wszystkie te kody . Na przykład:

# pylint: disable=locally-disabled, multiple-statements, fixme, line-too-long

Ten styl jest bardziej pouczający niż tajemnicze kody błędów, a także bardziej praktyczny, ponieważ nowsze wersje Pylint wyświetlają tylko symboliczną nazwę, a nie kod błędu.

Zależność między symbolicznymi nazwami a kodami można znaleźć tutaj .

Komentarz wyłączający można wstawić we własnym wierszu, stosując wyłączenie dla wszystkiego, co następuje po tym samym bloku. Alternatywnie można go wstawić na końcu linii, o którą ma się ubiegać.

Jeśli pylint generuje Locally disablingkomunikaty „ ”, możesz się ich pozbyć, włączając locally-disabled najpierw funkcję wyłączania, jak w powyższym przykładzie.

imolit
źródło
20
Ale wprowadzenie # pylint: disable=fooinlyne sprawia, że ​​jestem za długa, więc muszę dodać , line-too-long! Język w policzek; tego właśnie potrzebowałem i rozwiązałem mój problem. Dzięki!
dwanderson
Lista rzeczywistych ciągów do użycia: gist.github.com/m451/965bb613177dd4fa896b815aa0e0e365
masi
81

Aby wyłączyć ostrzeżenie lokalnie w bloku, dodaj

# pylint: disable=C0321

do tego bloku.

thakis
źródło
5
Jest to starsza technika i nie jest już zalecana. Zobacz inne odpowiedzi.
Acumenus,
1
Masz na myśli, że należy użyć nazwy symbolicznej zamiast numeru kodu, tak?
thakis
5
Tak. Odpowiedź przez imolit obejmuje dokładnie to.
Acumenus
2
Jak znaleźć symboliczną nazwę? Mój edytor wypluje [pylint] C0111: Missing method docstring, więc znalezienie numeru kodu jest łatwe, ale znalezienie symbolicznej nazwy oznacza, że ​​muszę to sprawdzić.
Adam Parkin
@AdamParkin Znalazłem tutaj moje wiadomości: pylint-messages.wikidot.com/all-messages
Jean-Francois T.
80

Istnieje kilka sposobów wyłączania ostrzeżeń i błędów w Pylint. Który z nich ma związek z tym, jak globalnie lub lokalnie chcesz zastosować blokadę - ważna decyzja projektowa.

Wiele podejść

  1. W jednym lub kilku pylintrcplikach.

Dotyczy to więcej niż ~/.pylintrcpliku (w katalogu $ HOME) zgodnie z opisem Chrisa Morgana. Pylint wyszuka pliki rc z pierwszeństwem, które bardziej ceni „bliższe” pliki:

  • pylintrcPlik w bieżącym katalogu roboczym; lub

  • Jeśli bieżący katalog roboczy znajduje się w module Pythona (tzn. Zawiera __init__.pyplik), przeszukuj hierarchię modułów Pythona aż do pylintrcznalezienia pliku; lub

  • Plik nazwany przez zmienną środowiskową PYLINTRC; lub

  • Jeśli masz katalog domowy, który nie jest /root:

    • ~/.pylintrc; lub

    • ~/.config/pylintrc; lub

    • /etc/pylintrc

Zauważ, że większość z tych plików ma nazwy pylintrc- tylko plik wewnątrz ~ma kropkę wiodącą.

Do pylintrcpliku dodaj wiersze, aby wyłączyć określone wiadomości pylint. Na przykład:

[MESSAGES CONTROL]
disable=locally-disabled
  1. Dalsze wyłącza z pylintlinii poleceń, jak opisano przez Aboo i Cairnarvon. To wygląda jak pylint --disable=bad-builtin. Powtórz, --disableaby ukryć dodatkowe elementy.

  2. Ponadto wyłącza poszczególne wiersze kodu Pythona, jak opisano w Imolit. Wyglądają jak some statement # pylint: disable=broad-except(dodatkowy komentarz na końcu oryginalnej linii źródłowej) i dotyczą tylko bieżącej linii . Moje podejście polega na tym, aby zawsze umieszczać je na końcu innych wierszy kodu, aby nie były mylone ze stylem bloku, patrz poniżej.

  3. Dalsze wyłączenia zdefiniowane dla większych bloków kodu Pythona, aż do kompletnych plików źródłowych.

    • Wyglądają jak # pragma pylint: disable=bad-whitespace(zwróć uwagę na pragmasłowo kluczowe).

    • Odnoszą się one do każdej linii po pragmie. Umieszczenie ich w górnej części pliku powoduje, że wyłączenia dotyczą całego pliku. Umieszczenie tego samego bloku niżej w pliku powoduje, że mają one zastosowanie tylko do linii następujących po tym bloku. Moje podejście polega na tym, aby zawsze umieszczać je osobno, aby nie były mylone ze stylem jednoliniowym, patrz wyżej.

    • Jeśli eliminacja powinna obowiązywać tylko w obrębie zakresu kodu, użyj # pragma pylint: enable=bad-whitespace(teraz enablenie używaj disable), aby zatrzymać tłumienie.

Zauważ, że wyłączenie jednej linii używa # pylintskładni, a wyłączenie tej linii używa tej # pragma pylintskładni. Można je łatwo pomylić, szczególnie podczas kopiowania i wklejania.

Kładąc wszystko razem

Zwykle używam kombinacji tych podejść.

  • Używam ~/.pylintrcdo absolutnie globalnych standardów - bardzo niewielu z nich.

  • Używam poziomu projektu pylintrcna różnych poziomach w modułach Python, gdy istnieją standardy specyficzne dla projektu. Zwłaszcza, gdy pobierasz kod od innej osoby lub zespołu, może się okazać, że używają konwencji, których nie wolisz, ale nie chcesz przerabiać kodu. Utrzymanie ustawień na tym poziomie pomaga nie rozpowszechniać tych praktyk w innych projektach.

  • Używam pragmów w stylu bloków u góry pojedynczych plików źródłowych. Lubię wyłączać pragnienia (przestać tłumić wiadomości) w ogniu rozwoju, nawet w przypadku standardów Pylint, z którymi się nie zgadzam (np. „Zbyt mało metod publicznych” - zawsze otrzymuję to ostrzeżenie o niestandardowych klasach wyjątków) - ale pomocne jest wyświetlanie więcej / może wszystkich wiadomości Pylint podczas tworzenia. W ten sposób możesz znaleźć przypadki, które chcesz rozwiązać za pomocą pragmatów jednowierszowych (patrz poniżej), lub po prostu dodać komentarze dla następnego programisty, aby wyjaśnić, dlaczego to ostrzeżenie jest w tym przypadku OK.

  • Niektóre z pragmatycznych bloków zostawiam włączone nawet wtedy, gdy kod jest gotowy do wpisania się. Próbuję użyć kilku z nich, ale gdy ma to sens dla modułu, można zrobić dokumentację. Staram się jednak pozostawiać jak najmniej, najlepiej żaden.

  • Używam stylu komentarza jednowierszowego do rozwiązywania szczególnie silnych błędów. Na przykład, jeśli istnieje miejsce, w którym ma to sens except Exception as exc, umieszczam # pylint: disable=broad-excepttę linię zamiast bardziej globalnego podejścia, ponieważ jest to dziwny wyjątek i należy go wywołać, zasadniczo jako formę dokumentacji.


Podobnie jak wszystko inne w Pythonie, możesz działać na różnych poziomach pośrednich. Radzę pomyśleć o tym, co należy na jakim poziomie, aby nie skończyć zbyt łagodnym podejściem do Pylinta.

Chris Johnson
źródło
1
Najlepsza odpowiedź, podobna do stackoverflow.com/questions/16266452/...
Christophe Roussy
1
W przeważającej części nie mogę opowiadać się za globalnym niepustym ~/.pylintrc. IMHO, konfiguracja powinna zazwyczaj być powiązana z projektem, a więc musi znajdować się gdzieś w projekcie. Tylko wtedy można kontrolować wersję i udostępniać projekt. W przeciwnym razie klon może nie mieć dostosowań niezbędnych do wyjścia pylinta bez drukowania wiadomości.
Acumenus,
@ABB Myślę, że to mądre
Chris Johnson
3
@ChrisJohnson Prefiks pragma wydaje się zupełnie niepotrzebny. Na przykład mam # pylint: disable=missing-docstringna górze mojego pliku i dotyczy on całej reszty pliku. Sprawdź i usuń pragmaprefiks z odpowiedzi.
Acumenus
Pylint FAQ nie pisze o żadnej pragmie. ( pylint.pycqa.org/en/latest/… ): możesz wyłączyć lub włączyć (globalnie wyłączone) wiadomości na poziomie modułu, dodając odpowiednią opcję w komentarzu u góry pliku: # pylint: disable = symbol wieloznaczny import, method-hidden # pylint: enable = too-many-lines
Yaroslav Nikitenko
18

Możesz także użyć następującego polecenia:

pylint --disable=C0321  test.py

Moja wersja pylint to 0.25.1.

aboo
źródło
To jest teraz starsza technika. Zamiast tego zalecane jest użycie symbolicznej nazwy wyłączonego ostrzeżenia. Zobacz tę odpowiedź .
Acumenus
Wydaje się, że to również nie działa z --py3kflagą :(
DylanYoung
Co ciekawe, działa dobrze, jeśli jest podany w rcpliku, i (bardziej kłopotliwe) faktycznie generuje poprawny rcplik --generate-rcfile. Uwielbiam kod z wieloma gałęziami, które robią to samo :(
DylanYoung
18

To jest FAQ :

4.1 Czy można lokalnie wyłączyć określoną wiadomość?

Tak, ta funkcja została dodana w Pylint 0.11. Można tego dokonać dodając
# pylint: disable=some-message,another-onena pożądanym poziomie bloku lub na końcu żądanego wiersza kodu.

4.2 Czy istnieje sposób na wyłączenie komunikatu tylko dla określonego modułu?

Tak, możesz wyłączyć lub włączyć (globalnie wyłączone) wiadomości na poziomie modułu, dodając odpowiednią opcję w komentarzu u góry pliku:

# pylint: disable=wildcard-import, method-hidden
# pylint: enable=too-many-lines

Możesz wyłączyć wiadomości poprzez:

  • numeryczne ID: E1101, E1102etc.
  • symboliczny komunikat: no-member, undefined-variableetc.
  • nazwa grupy czeków. Możesz je złapać pylint --list-groups.
  • kategoria kontroli: C, R, W, itd.
  • wszystkie czeki z all.

Zobacz dokumentację (lub uruchom pylint --list-msgsw terminalu), aby uzyskać pełną listę pylintwiadomości. Dokumenty stanowią również dobry przykład korzystania z tej funkcji.

Eugene Yarmash
źródło
5

Musisz tylko dodać jedną linię, aby wyłączyć to, co chcesz wyłączyć. Na przykład

#pylint: disable = line-too-long, too-many-lines, no-name-in-module, import-error, multiple-imports, pointless-string-statement, wrong-import-order

Dodaj to na nr 1 w swoim module

Chetan Malhotra
źródło
4

Jeśli to pomaga komuś, jeśli używasz Visual Studio Code, oczekuje on, że plik będzie kodowany w UTF8. Aby wygenerować plik, uruchomiłem pylint --generate-rcfile | out-file -encoding utf8 .pylintrcw PowerShell.

Elijah W. Gagne
źródło
0

Zgodnie z dokumentacją pylint najłatwiej jest użyć tej tabeli :

  • Kontrole związane z konwencją C.
  • Kontrole dotyczące refaktoryzacji R.
  • W różnych ostrzeżeń
  • Błędy E, dla prawdopodobnych błędów w kodzie
  • F fatal, jeśli wystąpił błąd uniemożliwiający dalszemu przetwarzaniu pylint.

Można więc użyć:

pylint -j 0 --disable=I,E,R,W,C,F YOUR_FILES_LOC
Arindam Roychowdhury
źródło
-1

Składnia w języku Python zezwala na więcej niż jedną instrukcję w wierszu, oddzieloną średnikiem (;). Jednak ograniczenie każdej linii do jednej instrukcji ułatwia człowiekowi przestrzeganie logiki programu podczas czytania.

Innym sposobem rozwiązania tego problemu jest zrozumienie, dlaczego jest tam komunikat o kłaczkach, i nie umieszczanie więcej niż jednej instrukcji w wierszu.

Tak, może być łatwiej pisać wiele instrukcji w wierszu, jednak pylint jest przeznaczony dla każdego innego czytelnika twojego kodu, nie tylko ciebie.

hrf
źródło
-1

Możesz spróbować tego:

Edytuj „C: \ Users \ Your User \ AppData \ Roaming \ Code \ User \ settings.json” i dodaj python.linting.pylintArgslinie na końcu, jak pokazano poniżej:

{
    "team.showWelcomeMessage": false,
    "python.dataScience.sendSelectionToInteractiveWindow": true,
    "git.enableSmartCommit": true,
    "powershell.codeFormatting.useCorrectCasing": true,
    "files.autoSave": "onWindowChange",
    "python.linting.pylintArgs": [
        "--load-plugins=pylint_django",
        "--errors-only"
    ],
}
aarw76
źródło