Làm cách nào để PyLint nhận ra các thành viên numpy?


163

Tôi đang chạy PyLint trên một dự án Python. PyLint đưa ra nhiều lời phàn nàn về việc không thể tìm thấy các thành viên khó tính. Làm thế nào tôi có thể tránh điều này trong khi tránh bỏ qua kiểm tra thành viên.

Từ mã:

import numpy as np

print np.zeros([1, 4])

Mà, khi chạy, tôi nhận được dự kiến:

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

Tuy nhiên, pylint cho tôi lỗi này:

E: 3, 6: Mô-đun 'numpy' không có thành viên 'số không' (không có thành viên)

Đối với các phiên bản, tôi đang sử dụng pylint 1.0.0 (astroid 1.0.1, phổ biến 0.60.0) và cố gắng làm việc với numpy 1.8.0.

Câu trả lời:


75

Nếu sử dụng Visual Studio Code với tiện ích mở rộng Python tuyệt vời của Don Jayamanne , hãy thêm cài đặt người dùng vào danh sách trắng numpy:

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

2
Điều này đã giúp! trên VSCode 1.12.2 đã xác nhận nó hoạt động trên WUsows 10 x64.
Simara

8
Tôi cần nhiều hơn: "python.linting.pylintArss": ["--ignored-mô-đun = numpy", "--ignored-class = numpy", "--extension-pkg-whlistist = numpy"]
Peter

2
Giải pháp của @Peter hoạt động trong Windows 7 x64 và Visual Studio Code 1.15.1 !!
BSP

3
@BSP Bài đăng của Peter không giải quyết được vấn đề, nó bỏ qua nó. Nếu tôi có thể đánh giá thấp nhận xét này thì tôi sẽ ..
Jonathan H

4
Điều này không còn hiệu quả với tôi nữa với pylint 2.3.0.
Guillhol

58

Tôi đã cùng một vấn đề ở đây, ngay cả với các phiên bản mới nhất của tất cả các gói liên quan ( astroid 1.3.2, logilab_common 0.63.2, pylon 1.4.0).

Giải pháp sau đây hoạt động như một cơ duyên: Tôi đã thêm vào numpydanh sách các mô-đun bị bỏ qua bằng cách sửa đổi pylintrctệp của mình , trong [TYPECHECK]phần:

[TYPECHECK]

ignored-modules = numpy

Tùy thuộc vào lỗi, bạn cũng có thể cần thêm dòng sau (vẫn trong [TYPECHECK] section):

ignored-classes = numpy

2
Trên linux với pylint 1.4.4, astroid 1.3.8 và Python 3.4.3, điều này đã hoạt động, nhưng tôi phải đặt extension-pkg-whitelist=numpydòng dưới [MASTER]tiêu đề của tệp .pylintrc. pylint dường như là phần mềm khá dễ vỡ và đòi hỏi một chuyên gia để giữ cho nó hoạt động cho các nhiệm vụ cơ bản.
Eric Leschinski

12
Đây không phải là một giải pháp tốt. Tất cả những gì nó làm là vô hiệu hóa hoàn toàn việc kiểm tra pylint cho sự tồn tại của bất kỳ thành viên nào. Lý tưởng nhất là bạn muốn nó nhận ra chúng đúng cách, đó là những gì các giải pháp khác làm.
iFreilicht

1
@iFreilicht Đó là một biện pháp bảo mật. Trong thời gian chạy, định nghĩa mô-đun có thể thay đổi linh hoạt; nhưng cho phép điều này trong pylint sẽ liên quan đến việc chạy mã tùy ý. Tuy nhiên, tôi vẫn mong đợi một số loại ghi chú trong câu trả lời --extension-pkg-whitelist, trong đó thực sự thực hiện nhập khẩu cho mô-đun được chỉ định.
Zev Spitz

43

Tôi đã nhận được cùng một lỗi cho một dự án nhỏ gọn mà tôi đang làm việc và quyết định rằng bỏ qua các mô-đun numpy sẽ làm tốt. Tôi đã tạo một .pylintrctệp với:

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

và làm theo lời khuyên của paduwan và j_houg, tôi đã sửa đổi các lĩnh vực sau:

[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

[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

và nó "sửa" vấn đề của tôi.


6
Bạn có chắc chắn bạn cũng phải thêm nó vào hai ignored-*lối vào không? Đối với tôi, chỉ cần thêm một mô-đun vào danh sách trắng mở rộng hoạt động hoàn hảo.
iFreilicht

39

Trong các phiên bản gần đây của pylint, bạn có thể thêm --extension-pkg-whitelist=numpyvào lệnh pylint của mình. Họ đã khắc phục vấn đề này trong một phiên bản trước đó một cách không an toàn. Bây giờ nếu bạn muốn họ xem xét kỹ hơn một gói bên ngoài thư viện tiêu chuẩn, bạn phải liệt kê danh sách trắng một cách rõ ràng. Xem ở đây.


2
Các liên kết Xem tại đây liên kết trực tuyến đã chết. Tuy nhiên, giải pháp vẫn đang hoạt động, thật khó để hiểu, tại sao. Sẽ thật tốt nếu thêm một đoạn trích từ vấn đề được liên kết.
GergelyPolonkai

Liên kết "Xem tại đây" đã được sửa chữa (hiện tham khảo cùng một vấn đề trong github)
David Clarke

Có vẻ như nó hoạt động cho các mô-đun và gói nhưng không phải tên lớp.
Ian A. Mason

17

Vì đây là kết quả hàng đầu trong google và nó cho tôi cảm giác rằng bạn phải bỏ qua những cảnh báo đó trong tất cả các tệp:

Vấn đề thực sự đã được khắc phục trong các nguồn pylint / astroid tháng trước https://bitbucket.org/logilab/astroid/commits/83d78af4866be5818f193360c78185e1008fd29e nhưng chưa có trong các gói Ubuntu.

Để có được các nguồn, chỉ cần

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

theo đó bước cuối cùng rất có thể sẽ yêu cầu một sudovà tất nhiên bạn cần sự đồng tâm để nhân bản.


Tôi sẽ nói rằng bạn không cần phải sao chép logilab / common mới nhưng bạn cần phải cài đặt logilab / astroid mới. Bằng cách cài đặt lại logilab / astroid và logilab / pylint, nó giải quyết được lỗi cho tôi.
paugier

7
Các bạn đang sử dụng phiên bản nào? Tôi đang sử dụng astroid 1.3.2 và pylint 1.4.0 và tôi vẫn gặp sự cố với mã này from numpy import ceildẫn đến E: 1, 0: No name 'ceil' in module 'numpy' (no-name-in-module) tôi đã kiểm tra cam kết được tham chiếu ở trên và có vẻ như những thay đổi đó là trong phiên bản astroid tôi có.
Zach Dwiel

2
Đã thực hiện chính xác như được đề xuất trên Xubfox 14.04 và điều này dẫn đến một pylint không hoạt động: py2.7.egg / pylint / lint.py ", dòng 866, trong check_astroid_module astroid.close () AttributionError: 'Module' không có thuộc tính ' đóng '
bli

3
Có lẽ đây là một hồi quy - dường như đã có một bản phát hành nhằm khắc phục vấn đề. Dù bằng cách nào, tôi đã mở một vấn đề mới về vấn đề này tại bitbucket.org/logilab/pylint/su/453/
ám

4
Rõ ràng điều này vẫn chưa được sửa trong pylint 1.4.2, astroid 1.3.4: Module 'numpy' has no 'zeros' member (no-member)
Bill

12

Để bỏ qua tất cả các lỗi được tạo bởi các thuộc tính của numpy.core, giờ đây chúng ta có thể sử dụng:

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

Là một giải pháp khác, hãy thêm tùy chọn này vào tệp ~ / .pylintrc hoặc / 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.*

Đối với đề cập trong mã câu hỏi cho đến nay, điều này có vẻ như không cần thiết, nhưng vẫn còn vấn đề đối với các mô-đun khác, tức là. mạng và vv


Tôi đã có cùng một vấn đề khi sử dụng patsy.dmatrices. Thêm generated-members=patsy.dmatricesgiải quyết vấn đề của tôi.
Jonas Dahlbæk

12

Nếu bạn không muốn thêm nhiều cấu hình hơn, vui lòng thêm mã này vào tệp cấu hình của bạn, thay vì 'danh sách trắng'.

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

9
Bạn nên đề cập rằng điều này áp dụng rất cụ thể cho Mã VS.
bers

Nó sẽ xuất rapylint: error: no such option: --generate-members
Spaceship222

8

Đã có nhiều lỗi khác nhau được báo cáo về điều này trong vài năm qua, ví dụ: https://bitbucket.org/logilab/pylint/su/58/false-poseitive-no-member-on-numpy-imports

Tôi đề nghị vô hiệu hóa cho các dòng nơi xảy ra khiếu nại.

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

10
Tôi sử dụng numpy rất nhiều, đến mức tôi có thể vô hiệu hóa kiểm tra không có thành viên trong toàn bộ tệp, tuy nhiên, tôi muốn tránh làm điều đó.
Alphadelta14

2
-1 Chỉ vì câu trả lời của @ bijancn nên thay thế câu trả lời này.
LondonRob

@LondonRob nó không mặc dù. Vấn đề vẫn tồn tại trong 1.4.2. Giải pháp của paduwan tốt hơn ở chỗ nó không yêu cầu thêm hacky cruft vào mã của bạn.
nè 101

7

Có lẽ, nó bị nhầm lẫn với phương pháp nhập khẩu trừu tượng của numpy. Cụ thể, zerostrên thực tế numpy.core.multiarray.zeros, được nhập khẩu trong numpy với tuyên bố

from .core import *

lần lượt nhập khẩu với

from .numeric import *

và bằng số bạn sẽ tìm thấy

zeros = multiarray.zeros

Tôi đoán tôi sẽ bối rối thay cho PyLint!

Xem lỗi này cho phía PyLint của xem.


Tôi ước tôi chỉ có thể nhập các phương thức đơn lẻ như vậy, nhưng tôi sử dụng quá nhiều chức năng và nó sẽ làm cho việc nhập khẩu trở thành một mớ hỗn độn lớn.
Alphadelta14

@ Alphadelta14 Sẽ là một mớ hỗn độn lớn ngay cả khi tìm thấy tất cả chúng. Xem gợi ý trong liên kết ở cuối câu trả lời của tôi.
alko

2
Liên kết SO đó làm cho PyLint bỏ qua việc nhập một số mô-đun. Tôi không chắc chắn rằng nó sẽ làm cho nó loại bỏ các lỗi không có thành viên cho các tệp đó. Tôi cũng muốn tránh vá PyLint của mình nếu có thể.
Alphadelta14

@ Alphadelta14 Tôi đoán bạn nên đợi một bản vá cho PyLint rồi.
alko

4

Tôi đã phải thêm phần này vào đầu bất kỳ tập tin nào mà tôi sử dụng numpy rất nhiều.

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

Chỉ trong trường hợp ai đó trong nhật thực gặp rắc rối với Pydev và pylint ...


4

Trong phần Mở rộng cho câu trả lời của j_houss, bây giờ bạn có thể thêm các mô-đun được đề cập vào dòng này trong .pylintrc, đã được chuẩn bị trống trên thế hệ:

extension-pkg-whitelist=numpy

bạn có thể tạo một mẫu .pylintrc bằng cách thực hiện:

pylint --generate-rcfile > .pylintrc

và sau đó chỉnh sửa dòng đã đề cập


4

Điều này cuối cùng đã được giải quyết trong Pylint 1.8.2. Hoạt động tốt, không cần chỉnh pylintrc!


3

Đây là giải pháp giả mà tôi đã đưa ra cho vấn đề này.

#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

Sau đó, trong mã của bạn, thay vì gọi numpychức năng như np.arraynp.zerosvà như vậy, bạn sẽ viết np_array, np_zerosvv Ưu điểm của phương pháp này so với các phương pháp khác gợi ý trong câu trả lời khác:

  • Việc vô hiệu hóa / bật pylint bị giới hạn trong một vùng nhỏ trong mã của bạn
  • Điều đó có nghĩa là bạn không phải bao quanh tất cả các dòng duy nhất có một lệnh gọi hàm numpy với một lệnh pylint.
  • Bạn không thực hiện vô hiệu hóa lỗi cho toàn bộ tệp của mình, điều này có thể che giấu các vấn đề khác với mã của bạn.

Nhược điểm rõ ràng là bạn phải nhập rõ ràng mọi hàm numpy bạn sử dụng. Cách tiếp cận có thể được xây dựng trên. Bạn có thể định nghĩa mô-đun của riêng bạn, gọi nó numpy_importerlà như sau

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

Sau đó, mã ứng dụng của bạn chỉ có thể nhập mô-đun này (thay vì numpy) như

import numpy_importer as np 

và sử dụng tên như bình thường : np.zeros, np.arrayv.v.

Ưu điểm của việc này là bạn sẽ có một mô-đun duy nhất trong đó tất cả numpycác lần nhập có liên quan được thực hiện một lần và mãi mãi, sau đó bạn nhập nó với một dòng duy nhất, bất cứ nơi nào bạn muốn. Tuy nhiên, bạn phải cẩn thận rằng numpy_importerkhông nhập tên mà không tồn tại numpyvì những lỗi đó sẽ không bị bắt bởi pylint.


2

Tôi đã có vấn đề này với numpy, scipy, sklearn, nipy, v.v., và tôi đã giải quyết nó bằng cách gói epylint như vậy:

$ mèo 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,

Kịch bản lệnh này chỉ đơn giản là chạy epylint, sau đó loại bỏ đầu ra của nó để lọc các cảnh báo và lỗi dương tính giả. Bạn có thể mở rộng nó bằng cách thêm nhiều trường hợp elif.

Lưu ý: Nếu điều này áp dụng cho bạn, thì bạn sẽ muốn sửa đổi pychechers.sh của mình để nó thích như thế này

#!/bin/bash

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

(Tất nhiên, trước tiên bạn phải thực hiện epylint.py)

Đây là một liên kết đến .emacs của tôi https://github.com/dohmatob/mydotemacs . Hy vọng điều này hữu ích cho ai đó.


2

Điều này dường như hoạt động trên ít nhất Pylint 1.1.0:

[TYPECHECK]

ignored-classes=numpy

2

Giải pháp này hiệu quả với tôi

Về cơ bản, đi đến Chọn biểu tượng bánh răng từ dưới cùng bên trái => Cài đặt => Cài đặt không gian làm việc => Tiện ích mở rộng => Cấu hình Python => Nhấp vào bất kỳ Settings.json => thêm phần này vào tệp "python.linting.pylintArss": [" --extension-pkg-whlistist = numpy "] Tôi đang sử dụng VS 1.27.2


2

Tôi đã có cùng một vấn đề với một mô-đun khác ( kivy.properties) là mô-đun C được bao bọc như thế nào numpy.

Sử dụng VSCode v1.38.0, giải pháp được chấp nhận đã dừng tất cả các linting cho dự án. Vì vậy, trong khi nó thực sự đã loại bỏ dương tính giả no-name-in-module, nó không thực sự cải thiện tình hình.

Cách giải quyết tốt nhất đối với tôi là sử dụng --ignored-modulesđối số trên mô-đun vi phạm. Rắc rối là, chuyển bất kỳ đối số nào thông qua python.linting.pylintArgsxóa sạch các cài đặt VSCode mặc định , do đó bạn cũng cần phải thiết lập lại các đối số đó. Điều đó để lại cho tôi với tệp settings.json sau:

{
    "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.pylintArss": ["--generate-thành viên = kivy.properies"]
yee

1

Một chút sao chép dán từ câu trả lời trước để tóm tắt những gì đang hoạt động (ít nhất là đối với tôi: debian-jessie)

  1. Trong một số phiên bản cũ hơn pylintcó một vấn đề ngăn nó hoạt động với numpy (và các gói tương tự khác).

  2. Bây giờ vấn đề đó đã được giải quyết nhưng các gói C bên ngoài (giao diện python đến numpy giống như mã C) bị tắt theo mặc định vì lý do bảo mật.

  3. Bạn có thể tạo một danh sách trắng, để cho phép pylintsử dụng chúng trong tệp ~/.pylintrc.

Lệnh cơ bản để chạy: # CHỈ nếu bạn chưa có tệp .pylintrc trong nhà $ pylint --generate-rcfile> .pylintrc

Sau đó mở tệp và thêm các gói bạn muốn sau khi extension-pkg-whitelist=phân tách bằng dấu phẩy. Bạn có thể có hành vi tương tự bằng cách sử dụng tùy chọn --extension-pkg-whitelist=numpytừ dòng lệnh.

Nếu bạn bỏ qua một số gói trong [TYPECHECK]phần đó có nghĩa là pylintsẽ không bao giờ hiển thị lỗi liên quan đến các gói đó. Trong thực tế, pylintsẽ không cho bạn biết bất cứ điều gì về các gói đó.


0

Tôi đã làm việc trên một bản vá để pylint để giải quyết vấn đề với các thành viên năng động trong các thư viện như numpy. Nó thêm tùy chọn "mô-đun động" để buộc kiểm tra xem các thành viên có tồn tại trong thời gian chạy hay không bằng cách nhập thực sự mô-đun. Xem Vấn đề # 413 trong logilab / pylint . Ngoài ra còn có một yêu cầu kéo, xem liên kết trong một trong những ý kiến.


Đây là cách pydev giải quyết nó (một danh sách các mô-đun đặc biệt để kiểm tra tải). Công việc đó thế nào rồi?
Epu

0

Câu trả lời nhanh: cập nhật Pylint lên 1.7.1 (sử dụng conda-forge được cung cấp Pylint 1.7.1 nếu bạn sử dụng conda để quản lý các gói)

Tôi đã tìm thấy một vấn đề tương tự trong pylint GitHub ở đây và ai đó đã trả lời mọi thứ đều ổn sau khi cập nhật lên 1.7.1.


0

Tôi không chắc đây có phải là một giải pháp hay không, nhưng trong VSCode một khi tôi đã viết rõ ràng trong cài đặt người dùng của mình để bật pylint, tất cả các mô-đun đã được nhận ra.

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

0

Gần đây (vì có gì đó thay đổi trong spyder hoặc pylint hay?), Tôi đã nhận được lỗi E1101 ("không có thành viên") từ phân tích mã tĩnh của spyder trên các ký hiệu astropy.constants. Không biết tại sao.

Giải pháp đơn giản của tôi cho tất cả người dùng trên hệ thống Linux hoặc Unix (Mac có thể tương tự) là tạo / etc / pylintrc như sau:

[TYPECHECK]
ignored-modules=astropy.constants

Tất nhiên, điều này có thể, thay vào đó, được đặt trong tệp $ HOME / .pylintrc cá nhân. Và, tôi có thể đã cập nhật một tập tin hiện có.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.