Bagaimana cara saya membuat PyLint mengenali anggota yang numpy?

163

Saya menjalankan PyLint pada proyek Python. PyLint membuat banyak keluhan tentang tidak dapat menemukan anggota yang numpy. Bagaimana saya bisa menghindari ini sambil menghindari melewatkan cek keanggotaan.

Dari kode:

import numpy as np

print np.zeros([1, 4])

Yang, ketika berlari, saya mendapatkan yang diharapkan:

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

Namun, pylint memberi saya kesalahan ini:

E: 3, 6: Modul 'numpy' tidak memiliki anggota 'nol' (tidak ada anggota)

Untuk versi, saya menggunakan pylint 1.0.0 (astroid 1.0.1, 0.60.0 umum) dan mencoba bekerja dengan numpy 1.8.0.

Alphadelta14
sumber

Jawaban:

75

Jika menggunakan Visual Studio Code dengan ekstensi Python Don Jayamanne yang sangat baik , tambahkan pengaturan pengguna ke daftar putih numpy:

{
    // whitelist numpy to remove lint errors
    "python.linting.pylintArgs": [
        "--extension-pkg-whitelist=numpy"
    ]
}
David Clarke
sumber
2
Ini membantu! pada VSCode 1.12.2 dikonfirmasi itu berfungsi pada WIndows 10 x64.
Simara
8
Saya membutuhkan lebih banyak: "python.linting.pylintArgs": ["--ignored-modules = numpy", "--ignored-classes = numpy", "--extension-pkg-whitelist = numpy"]
Peter
2
Solusi @Peter bekerja di Windows 7 x64 dan Visual Studio Code 1.15.1 !!
BSP
3
@ BSP Posting Peter tidak menyelesaikan masalah, itu mengabaikannya. Jika saya bisa menghapus komentar ini, saya akan ..
Jonathan H
4
Ini tidak berfungsi lagi untuk saya dengan pylint 2.3.0.
Guillochon
58

Saya memiliki masalah yang sama di sini, bahkan dengan versi terbaru dari semua paket terkait ( astroid 1.3.2, logilab_common 0.63.2, pylon 1.4.0).

Solusi berikut ini berfungsi seperti pesona: Saya menambahkan numpyke daftar modul yang diabaikan dengan memodifikasi pylintrcfile saya , di [TYPECHECK]bagian:

[TYPECHECK]

ignored-modules = numpy

Bergantung pada kesalahan, Anda mungkin juga perlu menambahkan baris berikut (masih di dalam [TYPECHECK] section):

ignored-classes = numpy
paduwan
sumber
2
Di linux dengan pylint 1.4.4, astroid 1.3.8 dan Python 3.4.3, ini berhasil, tetapi saya harus meletakkan extension-pkg-whitelist=numpybaris di bawah [MASTER]judul file .pylintrc. pylint tampaknya merupakan perangkat lunak yang cukup rapuh dan membutuhkan sentuhan ahli agar tetap berfungsi untuk tugas-tugas dasar.
Eric Leschinski
12
Ini bukan solusi yang baik. Yang dilakukannya hanyalah menonaktifkan pylint untuk memeriksa keberadaan anggota. Idealnya Anda ingin mengenalinya dengan benar, dan itulah yang dilakukan solusi lain.
iFreilicht
1
@ iFreilicht Ini adalah langkah pengamanan. Saat runtime, definisi modul dapat berubah secara dinamis; tetapi mengaktifkan ini di pylint akan melibatkan menjalankan kode arbitrer. Namun demikian saya masih mengharapkan semacam catatan dalam jawaban tentang --extension-pkg-whitelist, yang sebenarnya melakukan impor untuk modul yang ditentukan.
Zev Spitz
43

Saya mendapatkan kesalahan yang sama untuk proyek numpy kecil yang sedang saya kerjakan dan memutuskan bahwa mengabaikan modul numpy akan baik-baik saja. Saya membuat .pylintrcfile dengan:

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

dan mengikuti saran paduwan dan j_houg saya memodifikasi sektor-sektor berikut:

[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

dan

[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

dan itu "memperbaiki" masalah saya.

lmount
sumber
6
Apakah Anda yakin Anda harus menambahkannya ke dua ignored-*pintu masuk juga? Bagi saya, hanya menambahkan modul ke daftar putih ekstensi berfungsi dengan baik.
iFreilicht
39

Dalam versi terbaru pylint Anda dapat menambahkan --extension-pkg-whitelist=numpyperintah pylint Anda. Mereka telah memperbaiki masalah ini di versi sebelumnya dengan cara yang tidak aman. Sekarang jika Anda ingin mereka melihat lebih cermat paket di luar perpustakaan standar, Anda harus secara eksplisit memasukkannya dalam daftar putih. Lihat disini.

j_houg
sumber
2
Tautan "Lihat di sini" sudah mati. Solusinya masih bekerja, hanya saja sulit untuk mengerti, mengapa. Akan lebih baik untuk menambahkan kutipan dari masalah yang tertaut.
GergelyPolonkai
Tautan "Lihat di sini" telah diperbaiki (sekarang merujuk masalah yang sama di github)
David Clarke
Sepertinya itu berfungsi untuk modul dan paket tetapi tidak nama kelas.
Ian A. Mason
17

Karena ini adalah hasil teratas di google dan itu memberi saya kesan bahwa Anda harus mengabaikan peringatan itu di semua file:

Masalahnya sebenarnya telah diperbaiki pada sumber pylint / astroid bulan lalu https://bitbucket.org/logilab/astroid/commits/83d78af4866be5818f193360c78185e1008fd29e tetapi belum ada dalam paket Ubuntu.

Untuk mendapatkan sumbernya, adil

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

dimana langkah terakhir kemungkinan besar akan membutuhkan sudodan tentu saja Anda perlu lincah untuk mengkloning.

bijancn
sumber
Saya akan mengatakan bahwa Anda tidak perlu mengkloning logilab baru / umum tetapi Anda perlu menginstal logilab / astroid baru. Dengan menginstal ulang logilab / astroid dan logilab / pylint, itu memecahkan bug untuk saya.
paugier
7
Versi mana yang kalian gunakan? Saya menggunakan astroid 1.3.2 dan pylint 1.4.0 dan saya masih mendapatkan masalah dengan from numpy import ceilhasil kode ini di E: 1, 0: No name 'ceil' in module 'numpy' (no-name-in-module) saya memeriksa komit yang dirujuk di atas dan tampaknya perubahan itu ada dalam versi astroid yang saya miliki.
Zach Dwiel
2
Melakukan persis seperti yang disarankan pada Xubuntu 14.04 dan ini menghasilkan pylint yang tidak berfungsi: py2.7.egg / pylint / lint.py ", baris 866, di check_astroid_module astroid.close () AttributeError: 'Modul' objek tidak memiliki atribut ' close '
bli
3
Mungkin ini adalah regresi - tampaknya memang ada rilis yang dimaksudkan untuk memperbaiki masalah. Either way, saya sudah membuka masalah baru tentang hal itu di bitbucket.org/logilab/pylint/issue/453/...
dstromberg
4
Rupanya ini masih belum diperbaiki di pylint 1.4.2, astroid 1.3.4: Module 'numpy' has no 'zeros' member (no-member)
Bill
12

Untuk mengabaikan semua kesalahan yang dihasilkan oleh atribut numpy.core, sekarang kita dapat menggunakan:

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

Sebagai solusi lain, tambahkan opsi ini ke file ~ / .pylintrc atau / etc / pylintrc :

[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.*

Untuk disebutkan dalam kode pertanyaan sekarang ini tampaknya redup, tetapi masih penting untuk modul lain, yaitu. netifaces dan lain-lain

Spatz
sumber
Saya memiliki masalah yang sama saat menggunakan patsy.dmatrices. Menambah generated-members=patsy.dmatricesmemecahkan masalah saya.
Jonas Dahlbæk
12

Jika Anda tidak ingin menambahkan konfigurasi lagi, harap tambahkan kode ini ke file konfigurasi Anda, alih-alih 'daftar putih'.

{
"python.linting.pylintArgs": ["--generate-members"],
}
lai_bluejay
sumber
9
Anda harus menyebutkan bahwa ini berlaku sangat spesifik untuk Kode VS.
bers
Ini akan menampilkanpylint: error: no such option: --generate-members
Spaceship222
8

Ada banyak bug berbeda yang dilaporkan tentang ini selama beberapa tahun terakhir yaitu https://bitbucket.org/logilab/pylint/issue/58/false-positive-no-member-on-numpy-imports

Saya sarankan menonaktifkan untuk jalur di mana keluhan terjadi.

# pylint: disable=E1103
print np.zeros([1, 4])
# pylint: enable=E1103
flyingsolow
sumber
10
Saya menggunakan banyak numpy, bahwa saya mungkin juga menonaktifkan cek tidak-anggota di seluruh file, namun, saya ingin menghindari melakukan itu.
Alphadelta14
2
-1 Hanya karena jawaban @ bijancn sekarang harus menggantikan yang ini.
LondonRob
@ LondonRob tidak. Masalah masih ada di 1.4.2. solusi paduwan lebih baik karena tidak perlu menambahkan cacat hack pada kode Anda.
naught101
7

Mungkin, itu bingung dengan metode impor numpy metode kasar. Yaitu, zerossebenarnya numpy.core.multiarray.zeros, diimpor numpy dengan pernyataan

from .core import *

pada gilirannya diimpor dengan

from .numeric import *

dan dalam numerik Anda akan menemukan

zeros = multiarray.zeros

Saya kira saya akan bingung menggantikan PyLint!

Lihat bug ini untuk sisi tampilan PyLint.

alko
sumber
Saya berharap saya bisa mengimpor metode tunggal seperti itu, tetapi saya menggunakan terlalu banyak fungsi dan itu akan membuat impor menjadi berantakan.
Alphadelta14
@ Alphadelta14 Akan sangat berantakan bahkan untuk menemukan mereka semua. Lihat saran di tautan di akhir jawaban saya.
alko
2
Tautan SO itu membuat PyLint mengabaikan impor beberapa modul. Saya tidak begitu yakin bahwa itu akan membuatnya tidak ada kesalahan anggota untuk file-file itu. Saya juga ingin menghindari menambal PyLint saya jika memungkinkan.
Alphadelta14
@ Alphadelta14 Saya kira Anda harus menunggu patch ke PyLint kalau begitu.
alko
4

Saya harus menambahkan ini di bagian atas file mana pun yang sering saya gunakan numpy.

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

Hanya dalam kasus seseorang dalam gerhana mengalami masalah dengan Pydev dan pylint ...

jakebrinkmann
sumber
4

Dalam ekstensi ke j_hougs jawaban, Anda sekarang dapat menambahkan modul yang dimaksud ke baris ini di .pylintrc, yang sudah disiapkan kosong pada generasi:

extension-pkg-whitelist=numpy

Anda dapat menghasilkan sampel .pylintrc dengan melakukan:

pylint --generate-rcfile > .pylintrc

dan kemudian edit baris yang disebutkan

transistor
sumber
4

Ini akhirnya diselesaikan dalam Pylint 1.8.2. Bekerja di luar kotak, tidak ada tweak pylintrc diperlukan!

Tomi Aarnio
sumber
3

Ini adalah solusi semu yang saya buat untuk masalah ini.

#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

Kemudian, dalam kode Anda, bukan memanggil numpyfungsi sebagai np.arraydan np.zerosdan sebagainya, Anda akan menulis np_array, np_zeros, dll Keuntungan dari pendekatan ini vs pendekatan lain yang disarankan dalam jawaban lain:

  • Nonaktifkan / aktifkan pylint terbatas pada wilayah kecil kode Anda
  • Itu berarti bahwa Anda tidak harus mengelilingi setiap baris yang memiliki doa fungsi numpy dengan arahan pylint.
  • Anda tidak melakukan pylint menonaktifkan kesalahan untuk seluruh file Anda, yang mungkin menutupi masalah lain dengan kode Anda.

Kerugian yang jelas adalah bahwa Anda harus mengimpor setiap fungsi numpy yang Anda gunakan secara eksplisit. Pendekatannya bisa dijabarkan lebih lanjut. Anda bisa mendefinisikan modul Anda sendiri, sebut saja katakan, numpy_importersebagai berikut

""" 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

Kemudian, kode aplikasi Anda hanya dapat mengimpor modul ini (bukan numpy) sebagai

import numpy_importer as np 

dan menggunakan nama-nama seperti biasa: np.zeros, np.arraydll

Keuntungan dari ini adalah bahwa Anda akan memiliki satu modul di mana semua numpyimpor terkait dilakukan sekali dan untuk semua, dan kemudian Anda mengimpornya dengan satu baris itu, di mana pun Anda inginkan. Namun Anda harus berhati-hati agar numpy_importertidak mengimpor nama yang tidak ada numpykarena kesalahan tersebut tidak akan ditangkap oleh pylint.

Mateo
sumber
2

Saya punya masalah dengan numpy, scipy, sklearn, nipy, dll, dan saya menyelesaikannya dengan membungkus epylint seperti:

$ cat epylint.py

#!/usr/bin/python

"""
Synopsis: epylint wrapper that filters a bunch of false-positive warnings and errors
Author: DOHMATOB Elvis Dopgima <[email protected]> <[email protected]>

"""

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,

Script ini menjalankan epylint, lalu mengikis outputnya untuk menyaring peringatan dan kesalahan positif palsu. Anda dapat memperpanjangnya dengan menambahkan lebih banyak kasus elif.

NB: Jika ini berlaku untuk Anda, maka Anda ingin memodifikasi pychechers.sh Anda sehingga suka seperti ini

#!/bin/bash

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

(Tentu saja, Anda harus membuat epylint.py dieksekusi terlebih dahulu)

Berikut ini tautan ke .emacs saya https://github.com/dohmatob/mydotemacs . Semoga ini bermanfaat bagi seseorang.

dohmatob
sumber
2

Ini tampaknya berfungsi setidaknya pada Pylint 1.1.0:

[TYPECHECK]

ignored-classes=numpy
Tomi Aarnio
sumber
2

Solusi ini berhasil untuk saya

Pada dasarnya, pergi ke Pilih ikon gir dari kiri bawah => Pengaturan => Pengaturan Ruang Kerja => Ekstensi => Konfigurasi Python => Klik pada Settings.json => tambahkan ini di file "python.linting.pylintArgs": [" --extension-pkg-whitelist = numpy "] Saya menggunakan VS 1.27.2

Sanjeev Singh Kenwar
sumber
2

Saya punya masalah yang sama dengan modul yang berbeda ( kivy.properties) yang merupakan modul C dibungkus seperti numpy.

Menggunakan VSCode V1.38.0, solusi yang diterima menghentikan semua linting untuk proyek. Jadi, sementara itu memang menghilangkan false-positive no-name-in-module, itu tidak benar-benar memperbaiki situasi.

Solusi terbaik bagi saya adalah dengan menggunakan --ignored-modulesargumen pada modul yang menyinggung. Masalahnya, melewati argumen melalui python.linting.pylintArgstisu keluar pengaturan VSCode standar , sehingga Anda perlu kembali mengatur mereka juga. Itu membuat saya dengan file settings.json berikut:

{
    "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"
    ]
}
Mikah Barnett
sumber
"python.linting.pylintArgs": ["--generate-members = kivy.properties"]
yee
1

Sedikit copy paste dari jawaban sebelumnya untuk meringkas apa yang berfungsi (setidaknya untuk saya: debian-jessie)

  1. Dalam beberapa versi yang lebih lama pylintada masalah yang mencegahnya bekerja dengan numpy (dan paket serupa lainnya).

  2. Sekarang masalah telah dipecahkan tetapi paket-paket C eksternal (antarmuka python ke kode C-seperti numpy-) dinonaktifkan secara default untuk alasan keamanan.

  3. Anda dapat membuat daftar putih, agar dapat pylintmenggunakannya dalam file ~/.pylintrc.

Perintah dasar untuk dijalankan: # HANYA jika Anda belum memiliki file .pylintrc di rumah Anda $ pylint --generate-rcfile> .pylintrc

Kemudian buka file dan tambahkan paket yang Anda inginkan setelah extension-pkg-whitelist=dipisahkan dengan koma. Anda dapat memiliki perilaku yang sama menggunakan opsi --extension-pkg-whitelist=numpydari baris perintah.

Jika Anda mengabaikan beberapa paket di [TYPECHECK]bagian itu berarti pylinttidak akan pernah menampilkan kesalahan terkait dengan paket itu. Dalam praktiknya, pylinttidak akan memberi tahu Anda apa pun tentang paket-paket itu.

Riccardo Petraglia
sumber
0

Saya telah mengerjakan patch untuk pylint untuk menyelesaikan masalah dengan anggota dinamis di perpustakaan seperti numpy. Ini menambahkan opsi "dynamic-modules" yang memaksa untuk memeriksa apakah ada anggota saat runtime dengan melakukan impor nyata dari modul. Lihat Edisi # 413 di logilab / pylint . Ada juga permintaan tarik, lihat tautan di salah satu komentar.

Czarek Tomczak
sumber
Ini adalah cara pydev memecahkannya (daftar modul khusus untuk memuat-memeriksa). Bagaimana pekerjaannya?
Epu
0

Jawaban cepat: perbarui Pylint ke 1.7.1 (gunakan conda-forge yang disediakan Pylint 1.7.1 jika Anda menggunakan conda untuk mengelola paket)

Saya menemukan masalah yang serupa di pylint GitHub di sini dan seseorang menjawab semuanya membaik setelah memperbarui ke 1.7.1.

Leon
sumber
0

Saya tidak yakin apakah ini solusi, tetapi dalam VSCode setelah saya menulis secara eksplisit di pengaturan pengguna saya untuk mengaktifkan pylint, semua modul dikenali.

{
    "python.linting.pep8Enabled": true,
    "python.linting.pylintEnabled": true
}
byryepez
sumber
0

Akhir-akhir ini (karena sesuatu berubah pada spyder atau pylint atau?), Saya mendapatkan error E1101 ("no member") dari analisis kode statis spyder pada simbol astropy.constants. Tidak tahu kenapa.

Solusi simplistis saya untuk semua pengguna di sistem Linux atau Unix (Mac mungkin serupa) adalah membuat / etc / pylintrc sebagai berikut:

[TYPECHECK]
ignored-modules=astropy.constants

Tentu saja, ini bisa, sebaliknya, dimasukkan ke dalam file $ HOME / .pylintrc pribadi. Dan, saya bisa memperbarui file yang sudah ada.

Richard Elkins
sumber