La meilleure pratique pour le réglage de la valeur par défaut d'un paramètre qui est censé être une liste en Python?
J'ai une fonction Python qui prend une liste en tant que paramètre. Si j'ai mis la valeur par défaut du paramètre à une liste vide comme ceci:
def func(items=[]):
print items
Pylint me dire "Dangereux valeur par défaut [] comme argument". Donc, je me demandais quelle est la meilleure pratique ici?
- c'est quelque chose que chaque débutant en python talons de leurs pieds sur une ou deux fois, c'est assez cool que pylint a arrêté d'écrire un horrible bug !
- Une simple astuce consiste à utiliser un tuple vide:
def func(items=())
. Un tuple est pas mutable donc pylint ferme, mais la question demande une liste, donc ce ne sera pas toujours pertinentes ou possibles.
Vous devez vous connecter pour publier un commentaire.
Utilisation
None
en tant que valeur par défaut:Le problème avec une mutable argument par défaut c'est qu'il va être partagé entre toutes les invocations de la fonction -- voir "avertissement important" dans la section pertinente du tutoriel Python.
func(items=new([]))
de la syntaxe.items = items or []
si je m'attends àitems
être un objet iterable type.J'ai juste rencontré pour la première fois, et ma pensée est: "eh bien, je ne veux pas muter la liste de toute façon, donc ce que je veux vraiment, c'est par défaut d'une liste immuable afin de Python va me donner une erreur si j'ai accidentellement pour les transformer." Une liste immuable est juste un n-uplet. Donc:
Sûr, si vous le passer à quelque chose qui n'a vraiment envie d'une liste (par exemple isinstance(articles, liste)), ensuite ce sera vous obtenez en difficulté. Mais c'est une odeur de code de toute façon.
my_copy = list(items)
. Il est venu avec un simple et très ingénieuse solution à un problème commun.Pour mutable objet en tant que paramètre par défaut de la fonction et de la méthode de déclarations le problème, c'est que l'évaluation et de la création a lieu exactement au même moment. Le python-analyseur lit de la fonction-tête et l'évalue au même moment.
Plus beginers asume qu'un nouvel objet est créé à chaque appel, mais ce n'est pas correct! UN objet (dans votre exemple d'une liste) est créé au moment de la DÉCLARATION et non à la demande lorsque vous appelez la méthode.
Pour imutable objets qui n'est pas un problème, parce que même si tous les appels partagent le même objet, c'est imutable et donc ses propriétés restent les mêmes.
Comme une convention vous utilisez le
None
objet pour les valeurs par défaut pour indiquer l'utilisation d'une initialisation par défaut, qui peut maintenant prendre place dans la fonction-corps, qui, naturellement, est évalué à du temps d'appel.En plus et aussi à mieux comprendre ce que python est, ici, ma petite sur le thème de l'extrait de code: