web-dev-qa-db-fra.com

La vérification d'erreur Pylint peut-elle être personnalisée?

J'utilise pydev où j'ai mis en place pylint ... Le problème est que même dans les commentaires, pylint signale des avertissements. Je cherchais à désactiver toute forme de vérification dans une ligne ou un commentaire de bloc . De plus, je souhaite suivre la convention de dénomination camelCase au lieu des caractères de soulignement pour les variables et les arguments dans mon code . Y a-t-il un moyen de spécifier de telles une règle sans insérer mon code avec aucun pylint: désactiver les commentaires?

32
Sumit Bisht

Vous pouvez désactiver globalement les avertissements d’une certaine classe en utilisant

pylint --disable=W1234

ou en utilisant un fichier de configuration spécial PyLint

pylint --rcfile=/path/to/config.file

Un exemple de fichier de configuration est donné ci-dessous:

[MESSAGES CONTROL]
# C0111 Missing docstring 
# I0011 Warning locally suppressed using disable-msg
# I0012 Warning locally suppressed using disable-msg
# W0704 Except doesn't do anything Used when an except clause does nothing but "pass" and there is no "else" clause
# W0142 Used * or * magic* Used when a function or method is called using *args or **kwargs to dispatch arguments.
# W0212 Access to a protected member %s of a client class
# W0232 Class has no __init__ method Used when a class has no __init__ method, neither its parent classes.
# W0613 Unused argument %r Used when a function or method argument is not used.
# W0702 No exception's type specified Used when an except clause doesn't specify exceptions type to catch.
# R0201 Method could be a function
# W0614 Unused import XYZ from wildcard import
# R0914 Too many local variables
# R0912 Too many branches
# R0915 Too many statements
# R0913 Too many arguments
# R0904 Too many public methods
disable=C0111,I0011,I0012,W0704,W0142,W0212,W0232,W0613,W0702,R0201,W0614,R0914,R0912,R0915,R0913,R0904,R0801

Voir la documentation sur le site dédié de Pylint .

45
cfedermann

Comme indiqué par cfedermann, vous pouvez spécifier la désactivation des messages dans un fichier ~/.pylintrc (notez que vous pouvez générer un fichier de raccord à l'aide de pylint --generate-rcfile si vous ne souhaitez pas utiliser de commentaires en ligne.

Vous verrez également dans le fichier généré, dans la section [BASIC], des options telles que "method-rgx", "function-rgx", etc. .

19
sthenault

Bien qu’il s’agisse d’une question ancienne, il convient de mentionner qu’on peut maintenant spécifier leur regex propre pour faire correspondre les noms .

Ensuite, votre expression rationnelle correspondant à l'affaire Camel serait quelque chose comme:

[a-z][a-zA-Z0-9]{2,30}$
3
pradyunsg

Voici l'exemple de contrôle personnalisé , et un autre exemple plus facile à comprendre .

Je faisais face à un problème similaire à vous. Le code suivant est ma solution. J'ai personnalisé un vérificateur pour interdire l'importation datetime.now. Vous pouvez le prendre pour référence:

class TestChecker(BaseChecker):
    """
    find the check type in the following url:
    https://github.com/PyCQA/pylint/blob/63eb8c4663a77d0caf2a842b716e4161f9763a16/pylint/checkers/typecheck.py
    """
    __implements__ = IAstroidChecker

    name = 'test-checker'
    priority = -1
    msgs = {
        'W0001': (
            'You should not import "%s"',
            'import-datetime-returns',
            'Should not import datetime'
        ),
    }

    def __init__(self, linter):
        super().__init__(linter)
        # I use original pylint's ImportsChecker as a property
        # from  import **
        self.forbidden_import = ['datetime.datetime.now']
        self.forbidden_import_from = ['datetime.now', 'now']
        self.forbidden_import_attribute = ['datetime.now', 'now', 'datetime.datetime.now']

    #the function will be rewrited
    def visit_importfrom(self, node):
        names = [name for name, _alias in node.names]
        for item in names:
            for check in self.forbidden_import_from:
                if item == check:
                    self.add_message('W0001', node=node, args=item)

    def visit_import(self, node):
        names = [name for name, _ in node.names]
        for item in names:
            for check in self.forbidden_import:
                if check == item:
                    self.add_message('W0001', node=node, args=item)

    def visit_attribute(self, node):
        for check_attr in self.forbidden_import_attribute:
            if check_attr == node.as_string():
                self.add_message('W0001', node=node, args=check_attr)


def register(linter):
    linter.register_checker(TestChecker(linter))
0
Deft-pawN

Je personnalise pylint de deux manières.

Utiliser un fichier de configuration

La première façon est où vous 

  • appelez pylint pour générer un fichier de configuration de modèle
  • alors vous adaptez le fichier de configuration à vos besoins/désirs
  • alors vous mettez le fichier de configuration dans votre emplacement de fichier de configuration par défaut pylint ou appelez toujours pylint et spécifiez le chemin du fichier de configuration

Utiliser un script wrapper

La deuxième méthode consiste à créer un script wrapper qui appelle pylint. Dans le script wrapper, vous avez un tas de lignes qui ressemblent à ceci:

pylint \
       ${options_here} \
       --disable=xyz1 \
       --disable=xyz_2 \
       ${more_options} \
       --disable=xyz_N \
       --disable=abc \
       $@

Actuellement, j'utilise l'approche de script wrapper car je souhaite que les problèmes soient triés par numéro de ligne et j'ai utilisé des scripts Shell pour obtenir cet ordre de tri.

0