How do I get PyLint to recognize numpy members?

前端 未结 22 1025
南旧
南旧 2020-11-28 20:29

I am running PyLint on a Python project. PyLint makes many complaints about being unable to find numpy members. How can I avoid this while avoiding skipping membership check

22条回答
  •  [愿得一人]
    2020-11-28 20:41

    I had this problem with numpy, scipy, sklearn, nipy, etc., and I solved it by wrapping epylint like so:

    $ cat epylint.py

    #!/usr/bin/python
    
    """
    Synopsis: epylint wrapper that filters a bunch of false-positive warnings and errors
    Author: DOHMATOB Elvis Dopgima  
    
    """
    
    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,
    

    This script simply runs epylint, then scrapes its output to filter out false-positive warnings and errors. You can extend it by added more elif cases.

    N.B.: If this applies to you, then you'll want to modify your pychechers.sh so it likes like this

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

    (Of course, you have to make epylint.py executable first)

    Here is a link to my .emacs https://github.com/dohmatob/mydotemacs. Hope this is useful to someone.

提交回复
热议问题