web-dev-qa-db-fra.com

Comment gérer le message "trop ​​d'attributs d'instance" de Pylint?

Je viens d'essayer de peloter du code avec Pylint, et la dernière erreur restante est

R0902: too-many-instance-attributes (8/7)

Je comprends la justification de la limitation du nombre d'attributs d'instance, mais sept semble un peu faible. Je me rends également compte que le linter ne devrait pas avoir le dernier mot. Cependant, j'aimerais savoir ce que je devrais faire au lieu de:

def __init__(self, output_file=None, output_dir=None):
    """
    Set the frobnicator up, along with default geometries
    """

    self.margin = 30

    self.pos = [0, 0]
    self.sep = [5, 5]

    self.cell = [20, 20]

    self.frobbr = library.Frobbr()

    page = self.frobbr.get_settings('page')

    self.lim = [page.get_width() - self.margin,
                page.get_height() - self.margin]

    self.filename = output_file
    self.moddir = output_dir

Dois-je regrouper les géométries dans un dict, faire autre chose pour empêcher Pylint de se plaindre, ou simplement l'ignorer (ce que je ne veux pas vraiment faire)?

45
Inductiveload

Le travail d'un linter est de vous informer des problèmes potentiels avec votre code, et comme vous le dites dans votre question, il ne devrait pas avoir le dernier mot.

Si vous avez considéré ce que pylint a à dire et décidé que pour cette classe, les attributs que vous avez sont appropriés (ce qui me semble raisonnable), vous pouvez à la fois supprimer l'erreur et indiquer que vous avez considéré le problème en ajoutant une désactivation commentez à votre classe:

class Frobnicator:

    """All frobnication, all the time."""

    # pylint: disable=too-many-instance-attributes
    # Eight is reasonable in this case.

    def __init__(self):
        self.one = 1
        self.two = 2
        self.three = 3
        self.four = 4
        self.five = 5
        self.six = 6
        self.seven = 7
        self.eight = 8

De cette façon, vous n'ignorez pas Pylint ni son esclave; vous l'utilisez comme outil utile mais faillible.

Par défaut, Pylint produira un message d'information lorsque vous désactivez localement une vérification:

 Locally disabling too-many-instance-attributes (R0902) (locally-disabled)

Vous pouvez empêcher le message that d'apparaître de deux manières:

  1. Ajouter un disable= drapeau lors de l'exécution de pylint:

    $ pylint --disable=locally-disabled frob.py 
    
  2. Ajoutez une directive à un fichier de configuration pylintrc:

    [MESSAGES CONTROL]
    disable = locally-disabled
    
57
Zero Piraeus

C'est une objection idéologique, mais personnellement, j'ai tendance à essayer de rendre ce type de changements aussi universel que possible. Si 7 n'est pas assez d'instances dans un fichier et que je choisis de l'autoriser ici, pourquoi pas partout? Je n'apporte pas toujours de modifications aux règles sur les peluches dans tous les domaines, mais j'y pense au moins. À cette fin, si vous souhaitez apporter une modification généralisée, dans votre fichier .pylintrc, modifiez max-attributes=7 dans la section DESIGN.

Comme je pense que 7 est un peu bas dans l'ensemble, j'ai changé:

[DESIGN]
max-attributes=7

à

max-attributes=12
17
Ian

La réponse de Zero Piraeus est bonne. Cela dit, puisque vous fournissez peu de contexte à votre méthode init, pas même un vrai nom de classe, il est difficile d'être affirmatif, mais je dirais que le nom de fichier et le moddir n'ont rien à faire à part la marge, la position, etc.

Les opérations d'E/S sont souvent mieux isolées en fonctions plutôt qu'en méthodes. Il existe souvent de nombreux formats et options de sérialisation différents, et la plupart du temps, vous ne voulez pas les mélanger avec votre logique d'objet (méthodes). Il est plus facile d'ajouter une nouvelle fonction IO qui prend un fichier, une chaîne, un objet blob ou autre et y renvoie l'objet encodé que de maintenir un objet qui a de nombreuses méthodes qui gèrent de nombreuses IO opérations.

5
NChauvat