복붙노트

[PYTHON] PyLint가 numpy 멤버를 인식하게하려면 어떻게해야합니까?

PYTHON

PyLint가 numpy 멤버를 인식하게하려면 어떻게해야합니까?

파이썬 프로젝트에서 PyLint를 사용하고있다. PyLint는 멍청한 회원을 찾을 수 없다는 것에 대해 많은 불만을 제기합니다. 회원 확인을 건너 뛰는 것을 피하면서 어떻게 피할 수 있습니까?

코드에서 :

import numpy as np

print np.zeros([1, 4])

어느 때, 도망 갔을 때 나는 기대를 얻었다.

그러나, 필 린트는 나에게이 오류를 준다 :

버전의 경우 pylint 1.0.0 (astroid 1.0.1, common 0.60.0)을 사용하고 numpy 1.8.0으로 작업하려고합니다.

해결법

  1. ==============================

    1.Don Jayamanne의 탁월한 Python 확장 기능으로 Visual Studio 코드를 사용하는 경우 사용자 설정을 허용 목록에 추가하십시오.

    Don Jayamanne의 탁월한 Python 확장 기능으로 Visual Studio 코드를 사용하는 경우 사용자 설정을 허용 목록에 추가하십시오.

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

    2.나는 모든 관련 패키지 (astroid 1.3.2, logilab_common 0.63.2, pylon 1.4.0)의 최신 버전에서도 동일한 문제가 발생했습니다.

    나는 모든 관련 패키지 (astroid 1.3.2, logilab_common 0.63.2, pylon 1.4.0)의 최신 버전에서도 동일한 문제가 발생했습니다.

    다음 솔루션은 매력처럼 작동했습니다 : 나는 [TYPECHECK] 섹션에서 내 pylintrc 파일을 수정하여 무시 된 모듈 목록에 numpy를 추가했습니다.

    [TYPECHECK]
    
    ignored-modules = numpy
    

    오류에 따라 다음 줄을 추가해야 할 수도 있습니다 (여전히 [TYPECHECK] 섹션에 있음).

    ignored-classes = numpy
    
  3. ==============================

    3.최근 버전의 pylint에서는 pylint 명령에 --extension-pkg-whitelist = numpy를 추가 할 수 있습니다. 그들은 안전하지 않은 방법으로 이전 버전에서이 문제를 해결했습니다. 이제 표준 라이브러리 외부의 패키지를보다 신중하게 바라는 경우 명시 적으로 허용 목록을 지정해야합니다. 여길 봐.

    최근 버전의 pylint에서는 pylint 명령에 --extension-pkg-whitelist = numpy를 추가 할 수 있습니다. 그들은 안전하지 않은 방법으로 이전 버전에서이 문제를 해결했습니다. 이제 표준 라이브러리 외부의 패키지를보다 신중하게 바라는 경우 명시 적으로 허용 목록을 지정해야합니다. 여길 봐.

  4. ==============================

    4.내가 작업하고 있던 작은 프로젝트에 대해 동일한 오류가 발생하여 numpy 모듈을 무시하는 것이 좋을 것입니다. .pylintrc 파일을 다음과 같이 작성했습니다.

    내가 작업하고 있던 작은 프로젝트에 대해 동일한 오류가 발생하여 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
    

    내 문제를 "고쳤습니다".

  5. ==============================

    5.이것은 Google의 최고 결과이므로 모든 파일에서 이러한 경고를 무시해야한다는 인상을 받았습니다.

    이것은 Google의 최고 결과이므로 모든 파일에서 이러한 경고를 무시해야한다는 인상을 받았습니다.

    문제는 실제로 지난 달 pylint / astroid의 출처에서 수정되었습니다. https://bitbucket.org/logilab/astroid/commits/83d78af4866be5818f193360c78185e1008fd29e 아직 우분투 패키지에는 들어 있지 않습니다.

    소스를 얻으려면

    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가 필요할 가능성이 높으며 물론 복제하려면 수은이 필요합니다.

  6. ==============================

    6.지난 몇 년 동안 여러 가지 버그가보고되었습니다 (예 : https://bitbucket.org/logilab/pylint/issue/58/false-positive-no-member-on-numpy-imports).

    지난 몇 년 동안 여러 가지 버그가보고되었습니다 (예 : 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
    
  7. ==============================

    7.아마, 그것은 numpy의 난해한 메소드 가져 오기 메소드와 혼동을 일으킬 것입니다. 즉, 0은 실제로는 numpy.core.multiarray.zeros이고, numpy로 가져온 문입니다.

    아마, 그것은 numpy의 난해한 메소드 가져 오기 메소드와 혼동을 일으킬 것입니다. 즉, 0은 실제로는 numpy.core.multiarray.zeros이고, numpy로 가져온 문입니다.

    from .core import *
    

    차례로 수입

    from .numeric import *
    

    숫자로 볼 수 있습니다.

    zeros = multiarray.zeros
    

    나는 PyLint 대신에 혼란 스러울 것이라고 생각한다.

    PyLint 측면에 대해서는이 버그를 참조하십시오.

  8. ==============================

    8.Extension to j_hougs 대답에서, 문제의 모듈을 .pylintrc의이 행에 추가 할 수 있습니다.이 행은 이미 생성시 비어있는 것으로 준비되어 있습니다.

    Extension to j_hougs 대답에서, 문제의 모듈을 .pylintrc의이 행에 추가 할 수 있습니다.이 행은 이미 생성시 비어있는 것으로 준비되어 있습니다.

    extension-pkg-whitelist=numpy
    

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

    pylint --generate-rcfile > .pylintrc
    

    언급 된 행을 편집하십시오.

  9. ==============================

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

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

    지금까지 질문 코드에서 언급했듯이 이것은 중복 된 것처럼 보이지만 여전히 다른 모듈에 대해서는 중요합니다. 넷피어 등

  10. ==============================

    10.이것은 내가이 문제에 대해 생각해 낸 의사 솔루션입니다.

    이것은 내가이 문제에 대해 생각해 낸 의사 솔루션입니다.

    #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 함수를 np.array 및 np.zeros 등으로 호출하는 대신, np_array, np_zeros 등을 쓸 수 있습니다. 이 접근법과 다른 접근법의 장점은 다음과 같습니다.

    분명한 단점은 사용하는 모든 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가 catch하지 않기 때문입니다.

  11. ==============================

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

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

    [TYPECHECK]
    
    ignored-classes=numpy
    
  12. ==============================

    12.이것은 마침내 Pylint 1.8.2에서 해결되었습니다. 상자 밖에서 작동, pylintrc 비틀기가 필요 없습니다!

    이것은 마침내 Pylint 1.8.2에서 해결되었습니다. 상자 밖에서 작동, pylintrc 비틀기가 필요 없습니다!

  13. ==============================

    13.나는 numpy, scipy, sklearn, nipy 등으로이 문제를 겪었고, 나는 이렇게 epylint를 감싸서 해결했다.

    나는 numpy, scipy, sklearn, nipy 등으로이 문제를 겪었고, 나는 이렇게 epylint를 감싸서 해결했다.

    $ cat 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,
    

    이 스크립트는 단순히 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에 대한 링크입니다. 희망이 누군가에게 유용합니다.

  14. ==============================

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

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

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

    Pydev와 pylint에 문제가있는 사람을 위해 ...

  15. ==============================

    15.이전 답변에서 복사 된 내용을 복사하여 (적어도 나를 위해 : debian-jessie) 작동하는 것을 요약합니다.

    이전 답변에서 복사 된 내용을 복사하여 (적어도 나를 위해 : debian-jessie) 작동하는 것을 요약합니다.

    실행할 기본 명령 :     # .pylintrc 파일이 아직없는 경우에만 #     $ pylint --generate-rcfile> .pylintrc

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

    [TYPECHECK] 섹션에서 일부 패키지를 무시하면 pylint는 해당 패키지와 관련된 오류를 절대로 표시하지 않습니다. 실제로 pylint는 패키지에 관해 당신에게 아무 것도 말하지 않을 것입니다.

  16. ==============================

    16.이 솔루션은 나를 위해 일했다.

    이 솔루션은 나를 위해 일했다.

    기본적으로 왼쪽으로 기어 아이콘을 선택 => 설정 => 작업 공간 설정 => 확장 => 파이썬 구성 => 설정 파일을 클릭하십시오. => 파일에 추가하십시오 "python.linting.pylintArgs": [ "--extension-pkg-whitelist = numpy"] VS 1.27.2를 사용하고 있습니다.

  17. ==============================

    17.필자는 numpy와 같은 라이브러리에서 동적 멤버를 사용하여 문제를 해결하기 위해 pylint에 대한 패치 작업을 수행했습니다. 모듈의 실제 가져 오기를 수행하여 런타임 중에 구성원이 존재하는지 확인하도록하는 "동적 모듈"옵션을 추가합니다. logilab / pylint의 413 호 문제를 참조하십시오. 또한 끌어 오기 요청이 있습니다 (주석 중 하나의 링크 참조).

    필자는 numpy와 같은 라이브러리에서 동적 멤버를 사용하여 문제를 해결하기 위해 pylint에 대한 패치 작업을 수행했습니다. 모듈의 실제 가져 오기를 수행하여 런타임 중에 구성원이 존재하는지 확인하도록하는 "동적 모듈"옵션을 추가합니다. logilab / pylint의 413 호 문제를 참조하십시오. 또한 끌어 오기 요청이 있습니다 (주석 중 하나의 링크 참조).

  18. ==============================

    18.빠른 답변 : Pylint를 1.7.1로 업데이트하십시오 (콘텐트를 사용하여 콘텐트를 관리하는 경우 Pylint 1.7.1을 사용하십시오)

    빠른 답변 : Pylint를 1.7.1로 업데이트하십시오 (콘텐트를 사용하여 콘텐트를 관리하는 경우 Pylint 1.7.1을 사용하십시오)

    나는 pylint GitHub에서 비슷한 문제를 발견했으며 누군가 1.7.1로 업데이트 한 후 모든 것이 OK가되었다고 대답했다.

  19. ==============================

    19.나는 이것이 해결책인지 확실하지 않지만, 일단 필립 (pylint)을 가능하게하는 사용자 설정에서 명시 적으로 쓴 적이있는 VSCode에서는 모든 모듈이 인식됩니다.

    나는 이것이 해결책인지 확실하지 않지만, 일단 필립 (pylint)을 가능하게하는 사용자 설정에서 명시 적으로 쓴 적이있는 VSCode에서는 모든 모듈이 인식됩니다.

    {
        "python.linting.pep8Enabled": true,
        "python.linting.pylintEnabled": true
    }
    
  20. from https://stackoverflow.com/questions/20553551/how-do-i-get-pylint-to-recognize-numpy-members by cc-by-sa and MIT license