-2
votes

__kwdefaultS__ est vide sur la fonction Python3 avec définis ** kwargs

python 3.6.8 strong> xxx pré>

i Obtenir la sortie suivante: strong> p>

Python 3.6.8 (default, Dec 29 2018, 10:04:55) 
Type 'copyright', 'credits' or 'license' for more information
IPython 7.1.1 -- An enhanced Interactive Python. Type '?' for help.

Out[1]: None {'test': 1, 'sim': 0.2}


1 commentaires

Eh bien, def xx (test = 1, sim = 0,2) accepte * args. def xx (*, test = 1, sim = 0,2) ne sera-t-il pas possible.


3 Réponses :


3
votes

Ma fonction est par conception devrait accepter uniquement des arguments de type mot-clé, c'est-à-dire non * args

Utilisez * pour le dire explicitement, vous obtiendrez votre sortie souhaitée: xxx

def foo (test = 1) fait pas marque test un argument mot-clé seulement. Il donne juste test une valeur par défaut, mais test peut toujours être transmis comme un argument de position, c'est-à-dire FOO (2) . .


0 commentaires

2
votes

__ kwdefault __ code> s'applique uniquement aux arguments acceptés uniquement em> par mot-clé; par the Docs :

__ par défaut __ code> - tuple de toutes les valeurs par défaut pour les paramètres de position ou de mots clés __ kwdefault __ code> - Mappage de toutes les valeurs par défaut pour les paramètres mot-clé-seulement p> BlockQuote>

Donc, si elles peuvent être transmises positionnellement, elles apparaissent dans __ par défaut __ code>. Si vous souhaitez effectuer les arguments mots clés - uniquement sans accepter des arguments de position, ajoutez un argument vide * code> (Nouveau dans Python 3; Non disponible en Python 2): P>

def xx(*, test=1, sim=0.2):
    return test + sim


0 commentaires

2
votes

En regardant le Modèle de données Documents , nous voyons que __ kwdefault __ est

Un dict contenant des valeurs par défaut pour les paramètres mot-clé seulement.

Les arguments mots clés ont été introduits dans PEP3102 . En bref, ils sont un argument qui suit soit * args ou un clair * dans le Liste d'arguments .

donc alors que Test et SIM DEF XX (TEST = 1, SIM = 0.2): MAI est spécifié par des mots-clés dans une invocation de fonction réelle, ils nommés en fait des arguments de position et non des mots clés.

Une solution de contournement simple serait de les faire par mot-clé uniquement en utilisant * : xxx

si vous devez obtenir les valeurs par défaut d'arguments nommés, vous pouvez également le faire avec le Inspect < / a> module: xxx

idée vient de ici .

L'avantage de cette solution est qu'il signalera les valeurs par défaut de la position positionnée et des mots clés au même endroit. De cette façon, vous n'avez pas à contraindre votre fonction pour accepter uniquement les arguments de mots clés.


0 commentaires