programing

Pylint가 NumPy 멤버를 인식하도록 하려면 어떻게 해야 합니까?

sourcejob 2023. 7. 3. 22:48
반응형

Pylint가 NumPy 멤버를 인식하도록 하려면 어떻게 해야 합니까?

저는 파이썬 프로젝트에서 Pylint를 운영하고 있습니다.Pylint는 NumPy 회원을 찾을 수 없다는 것에 대해 많은 불평을 합니다.회원 확인을 건너뛰는 것을 피하면서 어떻게 하면 이것을 피할 수 있습니까?

코드에서:

import numpy as np

print np.zeros([1, 4])

실행하면 다음과 같이 예상됩니다.

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

그러나 Pylint는 다음과 같은 오류를 표시합니다.

E: 3, 6: 모듈 'numpy'에 '0' 멤버가 없습니다(멤버 없음).

버전의 경우 Pylint 1.0.0(Astroid 1.0.1, 공통 0.60.0)을 사용하고 있으며 NumPy 1.8.0으로 작업하려고 합니다.

Visual Studio Code를 Don Jayamann의 뛰어난 Python 확장자와 함께 사용하는 경우 사용자 설정을 화이트리스트 NumPy에 추가합니다.

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

저는 모든 관련 패키지의 최신 버전에도 같은 문제가 있었습니다.astroid 1.3.2,logilab_common 0.63.2,pylon 1.4.0).

다음 솔루션은 매력적으로 작동했습니다: 나는 덧붙였습니다.numpy▁my▁▁modifying▁modules를 수정하여 무시된 모듈 으로.pylintrc의 파[TYPECHECK]섹션:

[TYPECHECK]

ignored-modules = numpy

행을 해야 할 .[TYPECHECK] section):

ignored-classes = numpy

제가 작업하던 작은 NumPy 프로젝트에서도 동일한 오류가 발생하여 NumPy 모듈을 무시해도 괜찮다고 판단했습니다.다음을 생성했습니다..pylintrc다음 파일이 포함된 파일:

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

그리고 paduwan과 j_houg의 조언에 따라 다음 섹터를 수정했습니다.

[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

그리고 그것은 제 문제를 "해결"했습니다.

의 Pylint에서는 최버전의에서할있수습다니를 할 수 .--extension-pkg-whitelist=numpy당신의 Pylint 명령에.

그들은 안전하지 않은 방법으로 이전 버전에서 이 문제를 해결했습니다.이제 표준 라이브러리 외부의 패키지를 좀 더 주의 깊게 살펴보려면 명시적으로 화이트리스트에 추가해야 합니다.여기 보세요.

이것은 구글 검색의 최고 결과이고 모든 파일에서 이러한 경고를 무시해야 한다는 인상을 주었기 때문입니다.

이 문제는 실제로 지난달 https://bitbucket.org/logilab/astroid/commits/83d78af4866be5818f193360c78185e1008fd29e 의 Pylint/astroid 소스에서 수정되었지만 Ubuntu 패키지에서는 아직 해결되지 않았습니다.

정보원을 얻으려면, 그냥

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

마지막 단계에 필요할 가능성이 가장 높습니다.sudo물론 복제를 위해서는 머큐리얼이 필요합니다.

numpy.core의 특성에 의해 생성된 모든 오류를 무시하기 위해 이제 다음을 사용할 수 있습니다.

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

다른 솔루션으로 ~/.pylintrc 또는 /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.*

기능은 PyLint 1.6.0에서 도입되었습니다.원래 질문의 코드 스니펫은 추가 설정 없이도 이 버전으로 린트 처리되었습니다.그러나 이것은 더 복잡한 경우에 유용합니다.

구성을 추가하지 않으려면 '화이트리스트' 대신 이 코드를 구성 파일에 추가하십시오.

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

지난 몇 년 동안 이것에 대해 많은 다양한 버그가 보고되었습니다. 예를 들어, https://bitbucket.org/logilab/pylint/issue/58/false-positive-no-member-on-numpy-imports .

불만 사항이 발생하는 회선은 비활성화하는 것이 좋습니다.

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

아마도 NumPy의 난해한 메소드 가져오기 방법과 혼동이 있을 것입니다. 즉,zeros은 실은입니다.numpy.core.multiarray.zeros은 "NumPy"입니다.

from .core import *

로 차례차례 수입되는.

from .numeric import *

그리고 당신은 숫자로 찾을 수 있을 것입니다.

zeros = multiarray.zeros

필린트 대신 내가 혼란스러울 것 같아요!

Pylint의 관점에서 이 버그를 참조하십시오.

이 문제는 마침내 Pylint 1.8.2에서 해결되었습니다.즉시 사용할 수 있으며, 필린트르크 조정이 필요하지 않습니다!

는 다른.kivy.properties는 NumPy와 C NumPy는 C 모듈입니다.

Visual Studio Code V1.38.0을 사용하여 승인된 솔루션은 프로젝트에 대한 모든 린트를 중지했습니다.했을▁the▁it▁remove-,,▁so▁false▁did만서지▁indeed,그래▁while제했거positive,no-name-in-module상황을 개선하지 못했습니다.

가장 좋은 해결 방법은 다음과 같은 방법을 사용하는 것이었습니다.--ignored-modules문제가 있는 모듈의 인수입니다.문제는, 어떤 논쟁도 다음과 같이 전달한다는 것입니다.python.linting.pylintArgs에서는 기본 Visual Studio Code 설정을 삭제하므로 이 설정도 재설정해야 합니다.이로 인해 다음과 같은 settings.json 파일이 생성되었습니다.

{
    "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"
    ]
}

제가 NumPy를 많이 사용하는 파일의 맨 위에 이것을 추가해야 했습니다.

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

일식에 있는 누군가가 Pydev와 Pylint에 문제가 있을 경우를 대비해서...

j_hugs 응답에 대한 확장으로 문제의 모듈을 생성 시 이미 비어 있는 .pylintrc의 이 줄에 추가할 수 있습니다.

extension-pkg-whitelist=numpy

다음을 수행하여 샘플 .pylintrc를 생성할 수 있습니다.

pylint --generate-rcfile > .pylintrc

그런 다음 언급된 줄을 편집합니다.

이것이 제가 이 문제에 대해 생각해 낸 유사 해결책입니다.

#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

에서, NumPy 함수를 코서에다드음으로 에, NumPy 를 런는호하로 부릅니다.np.array그리고.np.zeros등등, 당신은 글을 쓸 것입니다.np_array,np_zeros기타 답변에서 제안된 다른 접근 방식과 비교하여 이 접근 방식의 장점:

  • Pylint 비활성화/활성화는 코드의 작은 영역으로 제한됩니다.
  • 즉, NumPy 함수 호출이 있는 모든 라인을 Pylint 지시어로 둘러싸지 않아도 됩니다.
  • 전체 파일에 대한 오류를 Pylint 비활성화하지 않으므로 코드의 다른 문제를 가릴 수 있습니다.

분명한 단점은 사용하는 모든 NumPy 함수를 명시적으로 가져와야 한다는 것입니다.이 접근법은 더 자세히 설명될 수 있습니다.자신만의 모듈을 정의할 수 있습니다.numpy_importer하기와 같이

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

그러면 응용 프로그램 코드는 다음과 같이 (NumPy 대신) 이 모듈만 가져올 수 있습니다.

import numpy_importer as np

평소와 같이 이름을 사용합니다.np.zeros,np.array기타.

이 기능의 이점은 모든 NumPy 관련 가져오기가 한 번에 완료되는 단일 모듈을 사용할 수 있다는 것입니다. 그런 다음 원하는 곳에 한 줄로 가져오기만 하면 됩니다.그래도 조심해야 해요numpy_importer에서는 NumPy에 없는 이름은 가져오지 않습니다. 이러한 오류는 Pylint에서 감지되지 않기 때문입니다.

저는 NumPy, SciPy, sklearn, nipy 등에서 이 문제를 겪었고, 다음과 같이 에필린트를 포장하여 해결했습니다.

파일 epylint.파이의

#!/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,

이 스크립트는 epylint를 실행한 다음 출력을 스크랩하여 잘못된 긍정 경고 및 오류를 필터링합니다.더 많은 엘리프 케이스를 추가하여 확장할 수 있습니다.

N.B.: 만약 이것이 당신에게 적용된다면, 당신은 당신의 pychechers.sh 을 이렇게 하도록 수정하고 싶을 것입니다.

#!/bin/bash

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

(물론 epylint.py 을 먼저 실행 파일로 만들어야 합니다.)

여기 제 .emacs https://github.com/dohmatob/mydotemacs 링크가 있습니다.

이것은 적어도 Pylint 1.1.0에서 작동하는 것으로 보입니다.

[TYPECHECK]

ignored-classes=numpy

이 해결책은 저에게 효과가 있었습니다.

기본적으로 왼쪽 아래에서 기어 아이콘을 선택하려면 → 설정작업 공간 설정 → 확장Python 구성 → 임의의 설정을 클릭합니다.json → "python.lint.pylintArgs" 파일에 이를 추가합니다. : [ "--pystag-pkg-numpy = numpy

Visual Studio Code 1.27.2를 사용하고 있습니다.

효과가 있는 것을 요약하기 위해 이전 답변에서 약간의 복사 붙여넣기(적어도 나에게는: 데비안 8(제시))

  1. 일부 이전 버전의 Pylint에서는 NumPy(및 기타 유사한 패키지)와 함께 작동하는 것을 방지하는 문제가 있었습니다.

  2. 이제 그 문제는 해결되었지만, 외부 C 패키지(Python 인터페이스에서 C 코드와 유사한 NumPy-)는 보안상의 이유로 기본적으로 비활성화되어 있습니다.

  3. 할 수 있도록 허용할 수 .~/.pylintrc.

실행할 기본 명령:

# ONLY if you do not already have a .pylintrc file in your home
$ pylint --generate-rcfile > .pylintrc

를 그런다원패추키가다니합를지하는 뒤에 추가합니다.extension-pkg-whitelist=쉼표로 구분된옵션을 사용하여 동일한 동작을 수행할 수 있습니다.--extension-pkg-whitelist=numpy명령행에서.

패무를경의 일부 [TYPECHECK]이 섹션은 Pylint가 해당 패키지와 관련된 오류를 표시하지 않는다는 것을 의미합니다.실제로, Pylint는 당신에게 그 소포들에 대해 아무것도 말하지 않을 것입니다.

저는 NumPy와 같은 라이브러리의 동적인 멤버들과 문제를 해결하기 위해 Pylint에 패치를 적용하고 있습니다.

모듈을 실제 가져와 런타임 중에 구성원이 있는지 확인하는 "동적 모듈" 옵션이 추가됩니다.logilab/pylint의 이슈 #413을 참조하십시오.끌어오기 요청도 있습니다. 주석 중 하나에 있는 링크를 참조하십시오.

빠른 답변: Pylint를 1.7.1로 업데이트합니다(Conda를 사용하여 패키지를 관리하는 경우 Conda-forge 제공 Pylint 1.7.1 사용).

저는 여기 Pylint GitHub에서 비슷한 문제를 발견했고, 1.7.1로 업데이트한 후에 누군가가 모든 것이 정상이라고 답했습니다.

이것이 해결책인지는 모르겠지만, 일단 내가 사용자 설정에 명시적으로 Pylint를 활성화하기 위해 썼을 때 Visual Studio Code에서 모든 모듈이 인식되었습니다.

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

최근에 (스파이더나 Pylint 또는 ?에서 무언가가 변경된 이후), 나는 Astropy.constants 기호에 대한 스파이더의 정적 코드 분석에서 E1101 오류("멤버 없음")를 참조하십시오.왜 그런지 모르겠어요.

Linux 또는 Unix 시스템의 모든 사용자를 위한 간단한 솔루션(Mac도 유사할 수 있음)은 다음과 같이 /etc/pylintrc 파일을 만드는 것입니다.

[TYPECHECK]
ignored-modules=astropy.constants

물론, 대신 개인 $HOME/.pylintrc 파일에 넣을 수 있습니다.그리고 기존 파일을 업데이트할 수도 있었습니다.

생성된 멤버가 있는 오래된 버그입니다.np 또는 foo같은 numpy가 아닌 다른 이름을 사용하는 경우에는 Pylint가 인식하지 못하기 때문에 Pylint 구성(공백 또는 쉼표로 구분)에 추가해야 합니다.따라서 다음과 같이 표시되어야 합니다.

[pylint]
generated-members=numpy.*,np.*,foo.*

멤버가 없는 오류로 전체 경로를 던지기도 하지만 표현식은 정확해야 합니다.오래된 버그라서 곧 고쳐질 것 같습니다.logilab/pylint의 이슈 #2498을 확인합니다.

언급URL : https://stackoverflow.com/questions/20553551/how-do-i-get-pylint-to-recognize-numpy-members

반응형