J'exécute pylint sur du code et je reçois l'erreur "Trop peu de méthodes publiques (0/2)". Que signifie ce message? Les documents pylint ne sont pas utiles:
Utilisé lorsque la classe a trop peu de méthodes publiques, alors assurez-vous que cela en vaut vraiment la peine.
Réponses:
L'erreur dit essentiellement que les classes ne sont pas destinées à uniquement stocker des données, car vous traitez fondamentalement la classe comme un dictionnaire. Les classes doivent avoir au moins quelques méthodes pour opérer sur les données qu'elles contiennent.
Si votre classe ressemble à ceci:
Pensez à utiliser un dictionnaire ou un
namedtuple
. Bien que si une classe semble être le meilleur choix, utilisez-la. pylint ne sait pas toujours ce qui est le mieux.Notez que
namedtuple
c'est immuable et que les valeurs attribuées lors de l'instanciation ne peuvent pas être modifiées ultérieurement.la source
dict
ounamedtuple
. Utilisez une classe lorsque vous souhaitez ajouter de la logique à votre objet (par exemple, vous voulez que des choses se produisent lors de sa création, vous avez besoin que des choses spéciales se produisent lorsqu'il est ajouté, vous voulez effectuer des opérations dessus, contrôler la façon dont il affiché, etc.)namedtuple
craint - en plus d'avoir une syntaxe laide, vous ne pouvez pas la documenter ou fournir facilement des valeurs par défaut.namedtuple
j'ai regretté la décision. Il est incohérent d'autoriser à la fois l'accès nommé et les attributs d'accès indexés.Si vous étendez une classe, alors ma suggestion est de désactiver systématiquement cet avertissement et de passer à autre chose, par exemple dans le cas des tâches Celery:
Même si vous n'étendez qu'une seule fonction, vous avez certainement besoin d'une classe pour faire fonctionner cette technique, et l'extension est certainement meilleure que le piratage des classes tierces!
la source
min-public-methods=0
dans la[BASIC]
section du fichier de configuration. Cela vous permet de le mettre sur une ligne distincte de tous vosdisable=
trucs (in[MESSAGE CONTROL]
), ce qui, selon moi, facilite l'ajout de commentaires détaillés sur les raisons pour lesquelles vous avez activé et désactivé les choses avec le changement de configuration.C'est un autre cas des
pylint
règles aveugles de 's.«Les classes ne sont pas destinées à stocker des données» - c'est une fausse déclaration. Les dictionnaires ne sont pas bons pour tout. Un membre de données d'une classe est quelque chose de significatif, un élément de dictionnaire est quelque chose de facultatif. Preuve: on peut faire
dictionary.get('key', DEFAULT_VALUE)
pour empêcher unKeyError
, mais il n'y a pas de simple__getattr__
avec le défaut.EDIT - méthodes recommandées pour utiliser les structures
J'ai besoin de mettre à jour ma réponse. En ce moment - si vous en avez besoin
struct
, vous avez deux bonnes options:a) Il suffit d'utiliser
attrs
Voici une bibliothèque pour cela:
https://www.attrs.org/en/stable/
Ce que vous obtenez en plus: ne pas écrire de constructeurs, valeurs par défaut, validation,
__repr__
objets en lecture seule (à remplacernamedtuples
, même en Python 2) et plus encore.b) Utiliser
dataclasses
(Py 3.7+)Suite au commentaire de hwjp, je recommande également
dataclasses
:https://docs.python.org/3/library/dataclasses.html
C'est presque aussi bon que
attrs
, et c'est un mécanisme de bibliothèque standard ("piles incluses"), sans dépendances supplémentaires, sauf Python 3.7+.Reste de la réponse précédente
NamedTuple
n'est pas génial - surtout avant python 3typing.NamedTuple
: https://docs.python.org/3/library/typing.html#typing.NamedTuple - vous devriez certainement vérifier leNamedTuple
modèle "classe dérivée de ". Python 2 -namedtuples
créé à partir de descriptions de chaînes - est moche, mauvais et "programmer dans des chaînes littérales" stupide.Je suis d'accord avec les deux réponses actuelles ("envisager d'utiliser autre chose, mais pylint n'est pas toujours correct" - la réponse acceptée, et "utiliser le commentaire de suppression de pylint"), mais j'ai ma propre suggestion.
Permettez-moi de le souligner une fois de plus: certaines classes sont destinées uniquement à stocker des données.
Maintenant, l'option à considérer également - utilisez
property
-ies.Ci-dessus, vous avez des propriétés en lecture seule, ce qui est OK pour Value Object (par exemple, comme celles de Domain Driven Design), mais vous pouvez également fournir des setters - de cette façon, votre classe sera en mesure d'assumer la responsabilité des champs que vous avez - par exemple pour faire des validations etc. (si vous avez des setters, vous pouvez les assigner en les utilisant dans le constructeur, c'est-à-dire
self.foo = foo
au lieu de directself._foo = foo
, mais attention, les setters peuvent supposer que d'autres champs sont déjà initialisés, et alors vous avez besoin d'une validation personnalisée dans le constructeur) .la source
attrs
bibliothèque, qui était en fait le plan de création dudataclasses
module.namedtuples
ont une syntaxe étrange pour l'héritage ... exigeant que chaque classe qui en utilise un sache qu'il s'agit d'un tuple nommé et utilise à la__new__
place de__init__
.dataclasses
ne pas avoir cette limitationC'est difficile quand votre patron s'attend à un principe de responsabilité unique, mais le pylint dit non. Ajoutez donc une deuxième méthode à votre classe afin que votre classe enfreigne le principe de responsabilité unique. Dans quelle mesure vous êtes censé prendre le principe de responsabilité unique est dans l'œil du spectateur.
Ma solution,
J'ai ajouté une méthode supplémentaire à ma classe, donc elle fait maintenant 2 choses.
Je me demande simplement si je dois diviser ma classe en 2 fichiers séparés maintenant, et peut-être en modules également.
problème résolu, mais pas avec mes collègues qui passent toute la journée à discuter des spécifications, plutôt que de continuer, comme si c'était la vie ou la mort.
la source