Python: éviter pylint avertissements sur trop d'arguments
Je veux refactoriser un gros Python fonction en petits. Considérons, par exemple, cet extrait de code suivant:
x = x1 + x2 + x3 + x4 + x5 + x6 + x7 + x8 + x9
De sûr, c'est un exemple trivial. Dans la pratique, le code est plus complexe. Mon point est qu'il contient beaucoup de locaux-portée des variables qui doivent être transmises à l'extrait de fonction, qui pourrait ressembler à:
def mysum(x1, x2, x3, x4, x5, x6, x7, x8, x9):
x = x1 + x2 + x3 + x4 + x5 + x6 + x7 + x8 + x9
return x
Le problème est que pylint pourrait déclencher un avertissement sur trop d'arguments.
J'ai pu éviter l'avertissement en faisant quelque chose comme:
def mysum(d):
x1 = d['x1']
x2 = d['x2']
...
x9 = d['x9']
x = x1 + x2 + x3 + x4 + x5 + x6 + x7 + x8 + x9
return x
def mybigfunction():
...
d = {}
d['x1'] = x1
...
d['x9'] = x9
x = mysum(d)
mais cette approche loos laid pour moi, il nécessite d'écrire beaucoup de code qui est même superflu.
Est-il un meilleur moyen de le faire?
- Je crois mysum() peut être simplifiée: 'return sum(d.les valeurs ()) "ou au moins" return sum([d[foo] pour les foo in ('x1', 'x2', ..., 'x9')])'. Suis-je trop liste-de la compréhension heureux?
- Le mysum() n'est qu'une abstraction, dans des scénarios réels, le code qui doit être extraite est beaucoup plus complexe. Mon point, c'est avoir à passer beaucoup de variables à l'extrait de fonction et d'éviter la pylint avertissement si possible (sans explicitement pylint de simplement ignorer cet avertissement).
Vous devez vous connecter pour publier un commentaire.
Tout d'abord, l'un des Perlis de l'épigramme:
Les 10 arguments sont sans doute liés. Les regrouper dans un objet, et de passer à la place.
Faire un exemple, parce qu'il n'y a pas assez d'informations dans la question directement:
Alors vos 10 argument de la fonction:
devient:
et l'appelant des modifications:
Voulez-vous une meilleure façon de passer les arguments ou tout simplement un moyen d'arrêter
pylint
de vous donner un moment difficile? Dans ce dernier cas, il me semble que vous pourriez arrêter de le harceler en mettantpylint
contrôle des commentaires dans votre code, le long des lignes de:ou:
souvenir pour les réactiver dès que possible.
À mon avis, il n'y a rien intrinsèquement de mal avec le passage d'un grand nombre d'arguments et de préconiser des solutions d'emballage tout en haut dans certains conteneur argument n'est pas vraiment à résoudre tous les problèmes, autres que de s'arrêter
pylint
de vous tarauder :-).Si vous avez besoin de passer vingt arguments, puis de les transmettre. Il se peut que cela est nécessaire parce que votre fonction est d'en faire trop et d'une re-factoring pourrait aider, et c'est quelque chose que vous devriez regarder. Mais ce n'est pas une décision nous peut vraiment faire à moins que nous voir ce que le "vrai" code de l'est.
1.6.5
),disable-msg
etenable-msg
sont désormais obsolète. Vous êtes censé utiliser uniquementdisable
etenable
(description symbolique qui fonctionne avec ces).Vous pouvez facilement changer le nombre maximal d'arguments dans pylint. Il suffit d'ouvrir votre pylintrc fichier (générer si vous n'avez pas déjà un) et le changement:
max-args=5
à:
max-args = 6 #, ou toute valeur qui vous convient
De pylint de manuel
Vous pouvez essayer d'utiliser Python est variable d'arguments fonctionnalité:
Vous pourriez peut-être quelques uns des arguments dans les variables. Si vous avez besoin de beaucoup plus d'état d'une classe sonne comme une bonne idée pour moi.
De simplifier ou de séparer la fonction de sorte qu'il ne nécessite pas neuf arguments (ou ignorer pylint, mais esquive comme ceux que vous proposez à l'encontre du but de la charpie de l'outil).
EDIT: si c'est une mesure temporaire, désactiver l'avertissement pour la fonction en question à l'aide d'un commentaire tel que décrit ici: http://lists.logilab.org/pipermail/python-projects/2006-April/000664.html
Plus tard, vous pouvez grep pour toutes les personnes handicapées mises en garde.
Je n'aime pas se référant à la le nombre, la sybolic nom est beaucoup plus expressive et éviter d'avoir à ajouter un commentaire qui pourrait devenir obsolètes au fil du temps.
Donc je ferais plutôt:
Et je recommande aussi de ne pas le laisser pendre là: il restera actif jusqu'à ce que le fichier se termine ou s'il est désactivé, selon la première éventualité.
Afin de mieux faire:
Je vous recommande également l'activation/la désactivation d'un seul avertissement/d'erreur par ligne.
Python a quelques belles fonctionnelle des outils de programmation qui sont susceptibles de correspondre à vos besoins. Découvrez lambda fonctions et carte. Aussi, vous êtes à l'aide dicts quand il semble que vous seriez beaucoup mieux servi avec des listes. Pour la simple exemple fourni par vous, essayez de cet idiome. Notez que la carte serait mieux et plus vite, mais ne peuvent pas s'adapter à vos besoins:
Vous avez mentionné le fait d'avoir beaucoup de variables locales, mais franchement, si vous faites affaire avec des listes (ou tuples), vous devez utiliser les listes et le facteur de tous ces variables locales dans le long terme.
Je suis tombé sur la même lancinante erreur, que j'ai réalisé a quelque chose à voir avec une fonction cool PyCharm détecte automatiquement...il suffit d'ajouter le @staticmethod décorateur, et il sera automatiquement supprimer cette erreur, où la méthode est utilisée