Pylint uyarısını nasıl devre dışı bırakabilirim?


267

Uyarı C0321 ("tek bir satırda birden fazla ifade" devre dışı bırakmak çalışıyorum - Ben sık sık ifaynı satırda kısa tek satır sonuçları ile ifadeler koymak ), Pylint 0.21.1 (önemli ise: astng 0.20. 1, ortak 0.50.3, Python 2.6.6 (r266: 84292, 15 Eyl 2010, 16:22:56)).

disable=C0321Pylint yapılandırma dosyasına eklemeyi denedim , ancak Pylint yine de raporlama konusunda ısrar ediyor. (Gibi bu hat üzerine çeşitlemeler disable=0321ya disable=C321) PyLint yüzden hatalar olarak işaretlenir does düzgün seçeneği tanımak, sadece onu görmezden geliyor.

Bu bir Pylint hatası mı yoksa yanlış bir şey mi yapıyorum? Bunun etrafında bir yol var mı? Bu gürültünün bir kısmından gerçekten kurtulmak istiyorum.


1
Tek bir kod satırını devre dışı bırakmak istiyorsanız, iyi bir çözüm var , tüm hatalar değil.
Le Droid

Yanıtlar:


168

pylint --generate-rcfile şöyle gösterir:

[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=

Senin gibi görünüyor Yani ~/.pylintrcolması gereken disable=çizgi / a bölümü içinde o s [MESSAGES CONTROL].


1
Teşekkürler, ancak yukarıda gösterildiği gibi [MESAJLAR KONTROLÜ] bölümünde zaten var. Hâlâ önemsenmedi.
Head Geek

6
@Head Geek: benim için işe yarıyor. ~/.pylintrciki çizgi ile [MESSAGES CONTROL]ve disable=C0321. Bu mesajı engeller.
Chris Morgan

Tuhaf ... PyLint ile aynı sürüm mü?
Head Geek

@Head Geek: 0.21.3, astng 0.20.3 ve ortak 0.52.1 aslında (en son yüklediğimde, sizinkinden daha yeni)
Chris Morgan

1
@Chris Morgan: Ah. Muhtemelen zaten düzeltilmiş bir hata, o zaman - Ubuntu deposundaki sürümü kullanıyorum. Teşekkürler!
Head Geek

165

Eclipse kullanarak bu sorunu yaşadım ve aşağıdaki gibi çözdüm:

pylint klasöründe (ör. C:\Python26\Lib\site-packages\pylint), shift tuşunu basılı tutun, sağ tıklayın ve o klasördeki windows komutunu açmayı seçin. Tür:

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

Bu, standard.rcyapılandırma dosyasını oluşturur . Not defterinde ve altında [MESSAGES CONTROL], işareti kaldırın disable=ve devre dışı bırakmak istediğiniz mesaj kimliklerini ekleyin, örneğin:

disable=W0511, C0321

Dosyayı kaydedin ve Eclipse-> window-> preferences-> PyDev-> pylint'e argümanlar kutusuna şunu yazın:

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

Şimdi çalışmalı ...


Kodunuzun en üstüne, pylint tarafından yorumlanacak bir yorum da ekleyebilirsiniz :

# pylint: disable=C0321

tüm pylint mesaj kodlarına bağlantı


Örneğin --disable-ids=C0321, argümanlar kutusuna eklemek işe yaramaz. Kullanılabilir tüm pylint mesajları _messages, pylint.utils.MessagesHandlerMixInsınıfın bir örneğinin özniteliği olan sözlükte saklanır . Pylint'i argümanla çalıştırırken --disable-ids=...(en azından bir yapılandırma dosyası olmadan), bu sözlük başlangıçta boştur ve pylint içindeki bir KeyError istisnasını yükseltir ( pylint.utils.MessagesHandlerMixIn.check_message_id(). Eclipse'de Pylint Konsolunda (windows - show view - Console) bu hata mesajını görebilirsiniz , konsol simgesinin yanındaki konsol seçeneklerinden Pylint konsolu'nu seçin.)


2
Hayır, gerçekten olmamalı. 1) Sorulan soru ile ilgisi olmayan Eclipse'e atıfta bulunur. 2) Eski mesaj kodları aracılığıyla devre dışı bırakmayı önerir. Sorunun en basit çözümü için cevabımı veya daha fazla ayrıntı için Chris Johnson'un cevabını öneriyorum .
17:33, imolit

153

Pylint v. 0.25.3'ten başlayarak, tüm bu kod numaralarını hatırlamak yerine uyarıları devre dışı bırakmak için sembolik adları kullanabilirsiniz . Örneğin:

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

Bu stil şifreli hata kodlarından daha öğreticidir ve ayrıca daha pratiktir, çünkü Pylint'in yeni sürümleri hata kodunu değil, yalnızca sembolik adı verir.

Sembolik isimler ve kodlar arasındaki yazışma burada bulunabilir .

Devre dışı bırakma yorumu kendi satırına eklenebilir ve aynı blokta gelen her şeye devre dışı bırakma uygulanır. Alternatif olarak, uygulanması amaçlanan hattın sonuna eklenebilir.

Pylint " Locally disabling" mesajlarını verirse , yukarıdaki örnekte olduğu gibi locally-disabled önce devre dışı bırakmayı ekleyerek bunlardan kurtulabilirsiniz .


20
Ama # pylint: disable=fooinlyne koymak beni çok uzatıyor, bu yüzden şimdi eklemem gerek , line-too-long! Dil-yanak; ihtiyacım olan buydu ve sorunumu çözdü. Teşekkürler!
dwanderson

Kullanılacak gerçek dizelerle liste
masi

81

Bir blokta yerel olarak bir uyarıyı devre dışı bırakmak için

# pylint: disable=C0321

o bloğa.


5
Bu eski bir tekniktir ve artık önerilmemektedir. Diğer cevaplara bakın.
Acumenus

1
Yani kod numarası yerine sembolik ismi kullanmalısınız, değil mi?
thakis

5
Evet. İmolit tarafından cevap tam olarak bu kapsar.
Acumenus

2
Kişi sembolik ismi nasıl bulur? Editörüm tükürecek [pylint] C0111: Missing method docstring, bu yüzden kod numarasını bulmak kolay, ancak sembolik adı bulmak onu aramak zorunda olduğum anlamına geliyor.
Adam Parkin

@AdamParkin Mesajlarımı burada buldum: pylint-messages.wikidot.com/all-messages
Jean-Francois T.

80

Pylint'teki uyarıları ve hataları devre dışı bırakmanın birkaç yolu vardır. Hangisini kullanacağınız, engelliliği ne kadar küresel veya yerel olarak uygulamak istediğinizle ilgilidir - önemli bir tasarım kararı.

Çoklu Yaklaşımlar

  1. Bir veya daha fazla pylintrcdosyada.

Bu, ~/.pylintrcChris Morgan tarafından açıklanan dosyadan ($ HOME dizininizde) fazlasını içerir . Pylint, "daha yakın" dosyaları daha yüksek değerlere sahip bir öncelikle rc dosyalarını arayacaktır:

  • pylintrcGeçerli çalışma dizinindeki bir dosya; veya

  • Geçerli çalışma dizini bir Python modülündeyse (yani bir __init__.pydosya içeriyorsa ), bir pylintrcdosya bulunana kadar Python modüllerinin hiyerarşisini arar ; veya

  • Ortam değişkeni PYLINTRC tarafından adlandırılan dosya; veya

  • Eğer olmayan bir giriş dizininiz varsa /root:

    • ~/.pylintrc; veya

    • ~/.config/pylintrc; veya

    • /etc/pylintrc

Bu dosyaların çoğunun adlandırıldığını unutmayın pylintrc - yalnızca içindeki dosyanın önünde ~bir nokta vardır.

Senin için pylintrcdosyanın, devre dışı spesifik PyLint mesajlarına satırları ekleyin. Örneğin:

[MESSAGES CONTROL]
disable=locally-disabled
  1. pylintAboo ve Cairnarvon tarafından tarif edildiği gibi komut satırından daha fazla devre dışı bırakır . Bu benziyor pylint --disable=bad-builtin. Tekrar et--disableEk öğeleri bastırmak için .

  2. Imolit tarafından açıklandığı gibi ayrı Python kod satırlarından daha fazla devre dışı bırakır. Bunlar şuna benzer some statement # pylint: disable=broad-except(orijinal kaynak satırının sonuna ekstra yorum) ve yalnızca geçerli satır için geçerlidir . Benim yaklaşımım bunları her zaman diğer kod satırlarının sonuna koymak, böylece blok stili ile karıştırılmamalıdır, aşağıya bakınız.

  3. Daha büyük Python kod blokları için tanımlanan ve kaynak dosyaları tamamlayan diğer engeller.

    • Bunlar şuna benzer # pragma pylint: disable=bad-whitespace(pragma anahtar kelimeye ).

    • Bunlar pragmadan sonraki her satır için geçerlidir . Bunların bir bloğunu bir dosyanın üstüne koymak, bastırmanın tüm dosyaya uygulanmasını sağlar. Aynı bloğu dosyaya daha aşağı yerleştirmek, yalnızca bloğu izleyen satırlara uygulanmasını sağlar. Benim yaklaşımım bunları her zaman kendi çizgisine koymak, böylece tek çizgi stiliyle karıştırılmayacaklar, yukarıya bakın.

    • Bir baskılamanın yalnızca bir kod aralığı içinde uygulanması gerektiğinde, bastırmayı durdurmak için # pragma pylint: enable=bad-whitespace(şimdi enabledeğil kullanarak disable) kullanın.

Tek bir satır için # pylintdevre dışı bırakmanın sözdizimini, bu satırdan sonra devre dışı bırakmanın # pragma pylintsözdizimini kullandığını unutmayın . Bunların özellikle kopyalama ve yapıştırma sırasında karıştırılması kolaydır.

Hepsini bir araya koy

Genellikle bu yaklaşımların bir karışımını kullanırım.

  • ~/.pylintrcKesinlikle küresel standartlar için kullanıyorum - bunlardan çok az.

  • pylintrcProjeye özgü standartlar olduğunda Python modülleri içinde proje seviyesini farklı seviyelerde kullanıyorum. Özellikle başka bir kişiden veya ekipten kod alırken, tercih etmediğiniz kuralları kullandıklarını görebilirsiniz, ancak kodu yeniden çalışmak istemezsiniz. Ayarları bu seviyede tutmak, bu uygulamaları diğer projelere yaymamaya yardımcı olur.

  • Tek kaynak dosyalarının üstündeki blok stili pragmaları kullanıyorum. Kabul etmediğim Pylint standartları için bile geliştirme ısısında pragmaları kapatmayı (mesajları bastırmayı durdurmayı) seviyorum ("çok az kamu yöntemi" gibi - her zaman özel İstisna sınıfları üzerinde bu uyarıyı alıyorum) - ama geliştirirken daha fazla / belki de tüm Pylint mesajlarını görmek faydalı olacaktır. Bu şekilde, tek satırlık pragmalar ile ele almak istediğiniz vakaları bulabilirsiniz (aşağıya bakın) veya bu uyarının neden bu durumda uygun olduğunu açıklamak için bir sonraki geliştiriciye yorum ekleyebilirsiniz.

  • Kod kontrol etmek için hazır olduğunda bile bazı blok tarzı pragmalar etkin bırakın. Bunlardan azını kullanmaya çalışıyorum, ancak modül için mantıklı olduğunda, belge olarak yapmak sorun değil. Ancak mümkün olduğunca az, tercihen hiçbiri bırakmaya çalışıyorum.

  • Özellikle güçlü hataları ele almak için tek satırlık yorum stilini kullanıyorum. Örneğin, gerçekten mantıklı bir yer varsa except Exception as exc, # pylint: disable=broad-exceptdaha küresel bir yaklaşım yerine bu çizgiyi koydum çünkü bu garip bir istisna ve temelde bir belge biçimi olarak çağrılması gerekiyor.


Python'daki diğer her şey gibi, farklı dolaylı düzeylerde hareket edebilirsiniz. Benim tavsiyem, neyin hangi seviyede olduğunu düşünmek, böylece Pylint'e çok yumuşak bir yaklaşım getirmemeniz.



1
Çoğunlukla küresel bir boşluğu kullanmayı savunamıyorum ~/.pylintrc. IMHO, yapılandırma genellikle projeye bağlı olmalıdır ve bu nedenle proje içinde bir yerde olmalıdır. Ancak o zaman sürüm kontrol edilebilir ve proje ile paylaşılabilir. Bu başarısız olursa, bir klon, mesajın yazdırılmadan çıkması için silindirin çıkması için gerekli özelleştirmelere sahip olmayabilir.
Acumenus

@ABB Bence akıllıca
Chris Johnson

3
@ChrisJohnson Önek pragma tamamen gereksiz görünüyor. Örneğin, dosyamın # pylint: disable=missing-docstringüstünde var ve dosyanın geri kalanı için geçerlidir. Lütfen pragmaöneki kontrol edin ve cevabınızdan kaldırın .
Acumenus

Pylint SSS hiçbir pragma hakkında yazmaz. ( Pylint.pycqa.org/en/latest/... ): Devre dışı veya dosyanın başına bir yorumda tekabül seçeneği ekleyerek (global engelli) modülü düzeyinde mesajları etkinleştirebilirsiniz: # PyLint: disable = wildcard- içe aktarma, yöntem gizli # pylint: enable = çok fazla satır
Yaroslav Nikitenko

18

Aşağıdaki komutu da kullanabilirsiniz:

pylint --disable=C0321  test.py

Pylint versiyonum 0.25.1.


Bu artık eski bir teknik. Bunun yerine devre dışı uyarının sembolik adının kullanılması önerilir. Bu cevaba bakınız .
Acumenus

Bu --py3kbayrakla da işe yaramıyor :(
DylanYoung

İlginçtir ki, rcdosyada verilirse iyi çalışır ve (daha fazla rahatsız edici) aslında doğru bir rcdosya oluşturur --generate-rcfile. Aynı şeyi yapan birden fazla şubesi olan aşk kodu lazım :(
DylanYoung

18

Bu bir SSS :

4.1 Belirli bir mesajı yerel olarak devre dışı bırakmak mümkün mü?

Evet, bu özellik Pylint 0.11'de eklendi. Bu
# pylint: disable=some-message,another-one, istenen blok düzeyinde veya istenen kod satırının sonuna eklenerek yapılabilir .

4.2 Bir mesajı yalnızca belirli bir modül için devre dışı bırakmanın bir yolu var mı?

Evet, dosyanın üst kısmındaki bir açıklamaya karşılık gelen seçeneği ekleyerek iletileri modül düzeyinde devre dışı bırakabilir veya etkinleştirebilirsiniz (genel olarak devre dışı bırakılabilir):

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

İletileri şu yollarla devre dışı bırakabilirsiniz:

  • Sayısal ID: E1101,E1102 vs.
  • Sembolik mesaj: no-member, undefined-variablevb
  • bir kontrol grubunun adı. Bunları birlikte alabilirsiniz pylint --list-groups.
  • çeklerin kategori: C, R, Wvb
  • tüm kontroller all.

Mesajlarının tam listesi için dokümanlara bakın (veya pylint --list-msgsterminalde çalıştırın ) pylint. Dokümanlar ayrıca bu özelliğin nasıl kullanılacağına dair güzel bir örnek sunar .


5

Devre dışı bırakmak istediğiniz şeyi devre dışı bırakmak için bir satır eklemeniz yeterlidir. Örneğin

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

Bunu modülünüzde 1 numaraya ekleyin


4

Bunun birisine yardımcı olması durumunda, Visual Studio Code kullanıyorsanız, dosyanın UTF8 kodlamasında olmasını bekler. Dosyayı oluşturmak için pylint --generate-rcfile | out-file -encoding utf8 .pylintrcPowerShell'de koştum .


0

Gereğince PyLint dokümantasyon, en kolay bu kullanmaktır grafiği :

  • C sözleşmeyle ilgili kontroller
  • R kontrolleri ile ilgili kontroller
  • W çeşitli uyarılar
  • Koddaki olası hatalar için E hataları
  • F ölümcül, eğer pylint'in daha fazla işlem yapmasını engelleyen bir hata oluşursa.

Böylece biri kullanabilirsiniz:

pylint -j 0 --disable=I,E,R,W,C,F YOUR_FILES_LOC

-1

Python sözdizimi, noktalı virgül (;) ile ayrılmış bir satırda birden fazla ifadeye izin verir. Bununla birlikte, her satırı tek bir ifadeyle sınırlamak, bir insanın bir programı mantığı okurken onu takip etmesini kolaylaştırır.

Yani, bu sorunu çözmenin başka bir yolu, tiftik mesajının neden orada olduğunu ve bir satıra birden fazla ifade koymadığını anlamaktır.

Evet, her satıra birden çok ifade yazmayı daha kolay bulabilirsiniz, ancak pylint kodunuzu yalnızca siz değil diğer tüm okuyucular için de kullanabilirsiniz.


-1

Bunu denemek isteyebilirsiniz:

"C: \ Users \ Kullanıcı \ \ AppData \ Roaming \ Code \ User \ settings.json" dosyasını python.linting.pylintArgsdüzenleyin ve sonuna aşağıda gösterildiği gibi satır ekleyin :

{
    "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"
    ],
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.