PyLint'in numpy üyelerini tanımasını nasıl sağlarım?


163

PyLint'i bir Python projesinde çalıştırıyorum. PyLint, numpy üyelerini bulamamakla ilgili birçok şikayette bulunur. Üyelik kontrollerini atlayarak bu durumu nasıl önleyebilirim?

Koddan:

import numpy as np

print np.zeros([1, 4])

Hangi, koştu, beklenen olsun:

[[0. 0. 0. 0.]]

Ancak, pylint bana bu hatayı veriyor:

E: 3, 6: 'numpy' modülünde 'sıfır' üye yok (üye yok)

Sürümler için, pylint 1.0.0 (astroid 1.0.1, ortak 0.60.0) kullanıyorum ve numpy 1.8.0 ile çalışmaya çalışıyorum.

Yanıtlar:


75

Don Jayamanne'ın mükemmel Python uzantısıyla Visual Studio Code kullanıyorsanız numpy beyaz listeye bir kullanıcı ayarı ekleyin:

{
    // whitelist numpy to remove lint errors
    "python.linting.pylintArgs": [
        "--extension-pkg-whitelist=numpy"
    ]
}

2
Bu yardımcı oldu! VSCode 1.12.2 üzerinde 10 x64 Windows üzerinde çalıştığını doğruladı.
Simara

8
Daha fazlasına ihtiyacım vardı: "python.linting.pylintArgs": ["--ignored-modules = numpy", "--ignored-classes = numpy", "--extension-pkg-whitelist = numpy"]
Peter

2
Windows 7 x64 ve Visual Studio Code 1.15.1'de çalışan @Peter çözümü !!
BSP

3
@BSP Peter'ın gönderdiği sorunu çözmez, görmezden gelir. Bu yorumu indirebilirsem ..
Jonathan H

4
Pylint 2.3.0 ile artık benim için çalışmıyor.
Guillochon

58

Hatta ilgili tüm paketlerin son sürümleri ile, burada aynı sorunu vardı ( astroid 1.3.2, logilab_common 0.63.2, pylon 1.4.0).

Aşağıdaki çözüm bir cazibe gibi çalıştı: bölümünde , numpydosyamı değiştirerek yok sayılan modüller listesine ekledim :pylintrc[TYPECHECK]

[TYPECHECK]

ignored-modules = numpy

Hataya bağlı olarak, aşağıdaki satırı da eklemeniz gerekebilir (yine de [TYPECHECK] section):

ignored-classes = numpy

2
Pylint 1.4.4, astroid 1.3.8 ve Python 3.4.3 içeren linux'da bu işe yaradı, ancak extension-pkg-whitelist=numpysatırı [MASTER].pylintrc dosyasının başlığı altına koymak zorunda kaldım . pylint oldukça kırılgan bir yazılım gibi görünüyor ve temel görevler için çalışmasını sağlamak için bir uzmanın dokunmasını gerektiriyor.
Eric Leschinski

12
Bu iyi bir çözüm değil. Tüm yaptığı, herhangi bir üyenin varlığı için pylint kontrolünü tamamen devre dışı bırakmaktır. İdeal olarak, onları doğru bir şekilde tanımasını istersiniz, bu da diğer çözümlerin yaptığı şeydir.
iFreilicht

1
@iFreilicht Bu bir güvenlik önlemidir. Çalışma zamanında, modül tanımları dinamik olarak değişebilir; ancak bunu pylint'te etkinleştirmek rasgele kod çalıştırmayı gerektirir. Bununla birlikte, yine de --extension-pkg-whitelist, belirtilen modül için içe aktarmayı gerçekleştiren bir tür not bekliyorum .
Zev Spitz

43

Üzerinde çalıştığım küçük bir numpy projesi için aynı hatayı alıyordum ve numpy modüllerini görmezden gelmenin gayet iyi olacağına karar verdim. Şununla bir .pylintrcdosya oluşturdum :

$ pylint --generate-rcfile > ~/.pylintrc

ve paduwan ve j_houg'un tavsiyelerine uyarak aşağıdaki sektörleri değiştirdim:

[MASTER]

# A comma-separated list of package or module names from where C extensions may
# be loaded. Extensions are loading into the active Python interpreter and may
# run arbitrary code
extension-pkg-whitelist=numpy

ve

[TYPECHECK]

# List of module names for which member attributes should not be checked
# (useful for modules/projects where namespaces are manipulated during runtime
# and thus existing member attributes cannot be deduced by static analysis. It
# supports qualified module names, as well as Unix pattern matching.
ignored-modules=numpy

# List of classes names for which member attributes should not be checked
# (useful for classes with attributes dynamically set). This supports can work
# with qualified names.
ignored-classes=numpy

ve sorunumu "düzeltti".


6
İki ignored-*girişe de eklemek zorunda olduğunuzdan emin misiniz ? Benim için, sadece beyaz listeye bir modül eklemek mükemmel çalışıyor.
iFreilicht

39

Pylint'in son sürümlerinde --extension-pkg-whitelist=numpypylint komutunuza ekleyebilirsiniz . Bu sorunu daha önceki bir sürümde güvensiz bir şekilde çözmüşlerdi. Şimdi standart kitaplığın dışındaki bir pakete daha dikkatli bakmalarını istiyorsanız, açıkça beyaz listeye eklemelisiniz. Buraya bakın.


2
"Buraya bakın" bağlantısı öldü. Çözüm hala çalışıyor, anlamak zor (er), neden. Bağlantılı konudan bir alıntı eklemek güzel olurdu.
GergelyPolonkai

"Buraya bakın" bağlantısı düzeltildi (şimdi github'da aynı sorunu referans alıyor)
David Clarke

Modüller ve paketler için çalışıyor gibi görünüyor, ancak sınıf isimleri için değil.
Ian A. Mason

17

Bu google'da en iyi sonuç olduğundan ve bana tüm dosyalarda bu uyarıları göz ardı etmeniz gerektiği izlenimini verdi:

Sorun geçen ay pylint / astroid kaynaklarında düzeltildi https://bitbucket.org/logilab/astroid/commits/83d78af4866be5818f193360c78185e1008fd29e ama henüz Ubuntu paketlerinde yok.

Kaynakları almak için,

hg clone https://bitbucket.org/logilab/pylint/
hg clone https://bitbucket.org/logilab/astroid
mkdir logilab && touch logilab/__init__.py
hg clone http://hg.logilab.org/logilab/common logilab/common
cd pylint && python setup.py install

bu nedenle son adım büyük olasılıkla bir sudoklonlama gerektirir ve elbette klonlamak için cıvaya ihtiyacınız vardır.


Yeni logilab / common'ı klonlamanıza gerek olmadığını, ancak yeni logilab / astroid'i kurmanız gerektiğini söyleyebilirim. Logilab / astroid ve logilab / pylint'i yeniden yükleyerek hatayı benim için çözer.
paugier

7
Hangi sürümleri kullanıyorsunuz? Ben astroid 1.3.2 ve pylint 1.4.0 ve hala bu başvuru from numpy import ceilsonuçları E: 1, 0: No name 'ceil' in module 'numpy' (no-name-in-module)yukarıda belirtilen taahhüt kontrol ile ilgili sorun olsun ve bu değişiklikler var astroid sürümünde olduğu görünüyor.
Zach Dwiel

2
Tam olarak Xubuntu 14.04'te önerildiği gibi yaptı ve bu çalışmayan bir pylint ile sonuçlandı: py_.7.egg / pylint / lint.py ", 866 numaralı satır, check_astroid_module astroid.close () AttributeError: 'Module' nesnesinde nitelik yok ' close '
bli

3
Belki de bu bir gerileme - sorunu düzeltmeyi amaçlayan bir sürüm olduğu görülüyor. Her iki şekilde de, ben bu konuda yeni bir sorun açtım bitbucket.org/logilab/pylint/issue/453/...
dstromberg

4
Görünüşe göre bu hala pylint 1.4.2, astroid 1.3.4'te sabit değildir: Module 'numpy' has no 'zeros' member (no-member)
Bill

12

Numpy.core özniteliklerinin oluşturduğu tüm hataları göz ardı etmek için artık şunları kullanabiliriz:

$ pylint a.py --generated-members=numpy.*

Başka bir çözüm olarak, bu seçeneği ~ / .pylintrc veya / etc / pylintrc dosyasına ekleyin :

[TYPECHECK]

# List of members which are set dynamically and missed by pylint inference
# system, and so shouldn't trigger E1101 when accessed. Python regular
# expressions are accepted.
generated-members=numpy.*

Şimdiye kadar soru kodunda bahsedilen için bu reduntant gibi görünüyor, ama yine de başka bir modül için önemlidir. netifaces vb.


Kullanırken de aynı sorunu yaşadım patsy.dmatrices. Eklemek generated-members=patsy.dmatricessorunumu çözdü.
Jonas Dahlbæk

12

Daha fazla yapılandırma eklemek istemiyorsanız, lütfen bu kodu 'beyaz liste' yerine yapılandırma dosyanıza ekleyin.

{
"python.linting.pylintArgs": ["--generate-members"],
}

9
Bunun özellikle VS Kodu için geçerli olduğunu belirtmelisiniz.
BERS

Çıktı verecekpylint: error: no such option: --generate-members
Uzay gemisi222

8

Son birkaç yıldır bu konuda birçok farklı hata bildirildi, yani https://bitbucket.org/logilab/pylint/issue/58/false-positive-no-member-on-numpy-imports

Şikayetlerin oluştuğu satırlar için devre dışı bırakmanızı öneririm.

# pylint: disable=E1103
print np.zeros([1, 4])
# pylint: enable=E1103

10
Numpy'ı o kadar çok kullanıyorum ki, tüm dosyada üye olmayan denetimi de devre dışı bırakabilirim, ancak bunu yapmaktan kaçınmak istiyorum.
Alphadelta14

2
-1 Çünkü @ bijancn'in cevabı şimdi bunun yerini almalı.
LondonRob

@LondonRob olsa değil. 1.4.2'de hala sorun var. paduwan'ın çözümü, kodunuza hacky cruft eklemeyi gerektirmediği için daha iyidir.
naught101

7

Muhtemelen, numpy'nin abstruse yöntemlerini içe aktarma yöntemiyle karıştırılır. Yani, zerosaslında numpy.core.multiarray.zeros, deyim ile numpy olarak içe aktarılır

from .core import *

sırayla ile ithal

from .numeric import *

ve sayısal olarak

zeros = multiarray.zeros

Sanırım PyLint yerine kafam karışacaktı!

Görünümün PyLint tarafı için bu hataya bakın .


Keşke bunun gibi tek yöntemleri ithal edebilseydim, ama çok fazla fonksiyon kullanıyorum ve bu ithalatı büyük bir karmaşa haline getirecekti.
Alphadelta14

@ Alphadelta14 Hepsini bulmak bile büyük bir karmaşa olurdu. Cevabımın sonundaki bağlantıdaki öneriye bakın.
alko

2
Bu SO bağlantısı, PyLint'in bazı modülleri içe aktarmayı yok saymasına neden olur. Bu dosyalar için üye olmayan hataları bastırmak yapacak emin değilim. Mümkünse PyLint'imi yamalamaktan da kaçınmak istiyorum.
Alphadelta14

@ Alphadelta14 Sanırım PyLint için bir yama beklemelisin.
alko

4

Bunu çok fazla numpy kullandığım herhangi bir dosyanın üstüne eklemek zorunda kaldı.

# To ignore numpy errors:
#     pylint: disable=E1101

Tutulma olan birinin Pydev ve pylint ile sorun yaşaması durumunda ...


4

J_hougs cevabına eklenti bölümünde, söz konusu modülleri artık üretime boş olarak hazırlanmış olan .pylintrc içinde bu satıra ekleyebilirsiniz:

extension-pkg-whitelist=numpy

yaparak bir .pylintrc örneği oluşturabilirsiniz:

pylint --generate-rcfile > .pylintrc

ve sonra belirtilen satırı düzenleyin


4

Bu nihayet Pylint 1.8.2'de çözülmüştür. Kutunun dışında çalışır, hiçbir pylintrc tweaks gerekli!


3

Bu, bu sorun için bulduğum sahte çözüm.

#pylint: disable=no-name-in-module
from numpy import array as np_array, transpose as np_transpose, \
      linspace as np_linspace, zeros as np_zeros
from numpy.random import uniform as random_uniform
#pylint: enable=no-name-in-module

Ardından, kodda yerine çağıran numpygibi işlevleri np.arrayve np.zerosvb şu yazılır np_array, np_zerosvb diğer yanıtlar önerilen diğer yaklaşımlar vs bu yaklaşımın avantajları:

  • Pylint devre dışı bırakma / etkinleştirme kodunuzun küçük bir bölgesi ile sınırlıdır
  • Bu, bir numpy fonksiyonunun çağrılması olan her satırı bir pylint yönergesiyle kuşatmanız gerekmediği anlamına gelir.
  • Kodunuzdaki diğer sorunları maskeleyebilecek tüm dosyanız için hatayı pylint devre dışı bırakmıyorsunuz.

Açık dezavantajı, kullandığınız her numpy işlevini açıkça içe aktarmanız gerektiğidir. Yaklaşım daha da detaylandırılabilir. Kendi modülünüzü tanımlayabilir, numpy_importerşöyle diyebilirsiniz:

""" module: numpy_importer.py
       explicitely import numpy functions while avoiding pylint errors  
"""
#pylint: disable=unused-import
#pylint: disable=no-name-in-module
from numpy import array, transpose, zeros  #add all things you need  
from numpy.random import uniform as random_uniform
#pylint: enable=no-name-in-module

Ardından, uygulama kodunuz bu modülü (numpy yerine) yalnızca

import numpy_importer as np 

ve her zamanki gibi isimler kullanın: np.zeros, np.arrayvb

Bunun avantajı, numpyilgili tüm ithalatın bir kez ve herkes için yapıldığı tek bir modülünüz olması ve daha sonra istediğiniz yerde bu tek satırla içe aktarmanızdır. Yine de, numpy_importervar olmayan isimleri almadığına dikkat etmelisiniz, numpyçünkü bu hatalar pylint tarafından yakalanmayacaktır.


2

Numpy, scipy, sklearn, nipy, vb. İle bu sorunu yaşadım ve epylint'i bu şekilde sararak çözdüm:

$ cat Instagram Hesabındaki Resim ve Videoları epylint.py

#!/usr/bin/python

"""
Synopsis: epylint wrapper that filters a bunch of false-positive warnings and errors
Author: DOHMATOB Elvis Dopgima <gmdopp@gmail.com> <elvis.dohmatob@inria.fr>

"""

import os
import sys
import re
from subprocess import Popen, STDOUT, PIPE

NUMPY_HAS_NO_MEMBER = re.compile("Module 'numpy(?:\..+)?' has no '.+' member")
SCIPY_HAS_NO_MEMBER = re.compile("Module 'scipy(?:\..+)?' has no '.+' member")
SCIPY_HAS_NO_MEMBER2 = re.compile("No name '.+' in module 'scipy(?:\..+)?'")
NIPY_HAS_NO_MEMBER = re.compile("Module 'nipy(?:\..+)?' has no '.+' member")
SK_ATTR_DEFINED_OUTSIDE_INIT = re.compile("Attribute '.+_' defined outside __init__")
REL_IMPORT_SHOULD_BE = re.compile("Relative import '.+', should be '.+")
REDEFINING_NAME_FROM_OUTER_SCOPE = re.compile("Redefining name '.+' from outer scope")

if __name__ == "__main__":
    basename = os.path.basename(sys.argv[1])
    for line in Popen(['epylint', sys.argv[1], '--disable=C,R,I'  # filter thesew arnings
                       ], stdout=PIPE, stderr=STDOUT, universal_newlines=True).stdout:
        if line.startswith("***********"):
            continue
        elif line.startswith("No config file found,"):
            continue
        elif "anomalous-backslash-in-string," in line:
            continue
        if NUMPY_HAS_NO_MEMBER.search(line):
            continue
        if SCIPY_HAS_NO_MEMBER.search(line):
            continue
        if SCIPY_HAS_NO_MEMBER2.search(line):
            continue
        if "Used * or ** magic" in line:
            continue
        if "No module named" in line and "_flymake" in line:
            continue
        if SK_ATTR_DEFINED_OUTSIDE_INIT.search(line):
            continue
        if "Access to a protected member" in line:
            continue
        if REL_IMPORT_SHOULD_BE.search(line):
            continue
        if REDEFINING_NAME_FROM_OUTER_SCOPE.search(line):
            continue
        if NIPY_HAS_NO_MEMBER.search(line):
            continue
        # XXX extend by adding more handles for false-positives here
        else:
            print line,

Bu komut dosyası epylint'i çalıştırır, ardından yanlış pozitif uyarıları ve hataları filtrelemek için çıktısını sıyırır. Daha fazla elif vakası ekleyerek genişletebilirsiniz.

Not: Bu sizin için geçerliyse, pychechers.sh dosyanızı değiştirmek istersiniz,

#!/bin/bash

epylint.py "$1" 2>/dev/null
pyflakes "$1"
pep8 --ignore=E221,E701,E202 --repeat "$1"
true

(Tabii ki, önce epylint.py çalıştırılabilir yapmalısınız)

İşte .emacs https://github.com/dohmatob/mydotemacs için bir bağlantı . Umarım bu birisi için yararlıdır.


2

Bu en azından Pylint 1.1.0 üzerinde çalışıyor gibi görünüyor:

[TYPECHECK]

ignored-classes=numpy

2

Bu çözüm benim için çalıştı

Temel olarak, sol alttan dişli çark simgesini seçin => Ayar => Çalışma Alanı Ayarı => Uzantı => Python Yapılandırması => Herhangi bir Ayarlar'a tıklayın. Json => bunu "python.linting.pylintArgs" dosyasına ekleyin: [" --extension-pkg-whiteelist = numpy "] VS 1.27.2 kullanıyorum


2

Ben aynı kivy.propertiessarılmış bir C modülü gibi farklı bir modül ( ) ile aynı sorunu vardı numpy.

VSCode V1.38.0 kullanarak, kabul edilen çözüm proje için tüm astarları durdurdu. Yani, yanlış pozitifliği gerçekten ortadan no-name-in-modulekaldırsa da, durumu gerçekten iyileştirmedi.

Benim için en iyi çözüm --ignored-modules, rahatsız edici modülde argümanı kullanmaktı . Sorun üzerinden herhangi bir argüman geçerek olduğunu python.linting.pylintArgsdışarı mendil varsayılan VSCode ayarlarında da bu yeniden belirlemesi gerekir böylece. Bu beni aşağıdaki settings.json dosyasıyla bıraktı:

{
    "python.pythonPath": "C:\\Python\\Python37\\python.exe",
    "python.linting.pylintEnabled": true,
    "python.linting.enabled": true,
    "python.linting.pylintArgs": [
        "--ignored-modules=kivy.properties",
        "--disable=all",
        "--enable=F,E,unreachable,duplicate-key,unnecessary-semicolon,global-variable-not-assigned,unused-variable,binary-op-exception,bad-format-string,anomalous-backslash-in-string,bad-open-mode"
    ]
}

"python.linting.pylintArgs": ["--generate-members = kivy.properties"]
yee

1

Neyin işe yaradığını özetlemek için önceki yanıttan biraz kopya yapıştır (en azından benim için: debian-jessie)

  1. Bazı eski sürümlerinde pylintnumpy (ve diğer benzer paketler) ile çalışmasını engelleyen bir sorun vardı.

  2. Şimdi bu sorun çözüldü ancak harici C paketleri (C koduna benzer numpy'ye python arabirimleri) güvenlik nedeniyle varsayılan olarak devre dışı bırakıldı.

  3. pylintDosyada kullanılmasına izin vermek için beyaz bir liste oluşturabilirsiniz ~/.pylintrc.

Çalıştırılacak temel komut: # SADECE evinizde zaten bir .pylintrc dosyanız yoksa $ pylint --generate-rcfile> .pylintrc

Sonra dosyayı açın ve extension-pkg-whitelist=virgülle ayırdıktan sonra istediğiniz paketleri ekleyin . --extension-pkg-whitelist=numpyKomut satırındaki seçeneği kullanarak da aynı davranışa sahip olabilirsiniz .

Eğer bazı paketler göz ardı ederse [TYPECHECK]bölümünde demekse pylinto paketlere ilişkin hatayı hiçbir zaman gösterilmez. Uygulamada, pylintsize bu paketler hakkında bir şey söylemeyecektir.


0

Numpy gibi kütüphanelerdeki dinamik üyelerle sorunu çözmek için bir yama üzerinde çalışıyorum. Modülün gerçek bir aktarımını yaparak üyelerin çalışma zamanı sırasında var olup olmadığını kontrol etmeye zorlayan bir "dinamik modüller" seçeneği ekler. Bkz. Sayı # 413, logilab / pylint . Bir çekme isteği de var, yorumlardan birinde bağlantıya bakın.


Pydev bu şekilde çözer (yük incelemesi için özel bir modül listesi). Bu iş nasıl gidiyor?
Epu

0

Hızlı bir cevap: Pylint'i 1.7.1'e güncelleyin (paketleri yönetmek için conda kullanıyorsanız, sağlanan Conda-forge kullanın Pylint 1.7.1)

Pylint GitHub'da benzer bir sorun buldum ve birisi 1.7.1'e güncelledikten sonra her şeyin yolunda gittiğini yanıtladı.


0

Bunun bir çözüm olup olmadığından emin değilim, ancak bir kez pylint'i etkinleştirmek için kullanıcı ayarlarımda açıkça yazdım, tüm modüller tanındı.

{
    "python.linting.pep8Enabled": true,
    "python.linting.pylintEnabled": true
}

0

Son zamanlarda (spyder veya pylint veya? Bir şey değişti beri), astropy.constants semboller üzerinde spyder statik kod analizinden E1101 hataları ("üye yok") alıyorum. Neden olduğu hakkında bir fikrim yok.

Linux veya Unix sistemindeki (Mac muhtemelen benzer) tüm kullanıcılar için basit çözümüm aşağıdaki gibi / etc / pylintrc oluşturmaktır:

[TYPECHECK]
ignored-modules=astropy.constants

Tabii ki, bunun yerine kişisel bir $ HOME / .pylintrc dosyasına konabilir. Ve mevcut bir dosyayı güncelleyebilirdim.

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.