105 votes

Obtenir la valeur par défaut de l'argument d'une fonction ?

Pour cette fonction

def eat_dog(name, should_digest=True):
    print "mangé chien nommé %s. Digéré aussi ? %" % (name, str(should_digest))

Je veux, en dehors de la fonction, lire ses arguments et toutes les valeurs par défaut attachées. Donc, pour cet exemple spécifique, je veux savoir que name n'a pas de valeur par défaut (c'est-à-dire que c'est un argument requis) et que True est la valeur par défaut pour should_digest.

Je suis conscient de inspect.getargspec(), qui me donne des informations sur les arguments et les valeurs par défaut, mais je ne vois pas de lien entre les deux:

ArgSpec(args=['name', 'should_digest'], varargs=None, keywords=None, defaults=(True,))

A partir de cette sortie, comment puis-je savoir que True (dans le tuple defaults) est la valeur par défaut pour should_digest?

De plus, je suis conscient du modèle de "demander le pardon" pour aborder un problème, mais malheureusement la sortie de cette erreur ne me dira pas le nom de l'argument manquant:

>>> eat_dog()
Traceback (most recent call last):
  File "", line 1, in 
TypeError: eat_dog() prend au moins 1 argument (0 donné)

Pour donner du contexte (pourquoi je veux faire cela), j'expose des fonctions dans un module via une API JSON. Si l'appelant omet certains arguments de fonction, je veux renvoyer une erreur spécifique qui nomme l'argument de fonction spécifique qui a été omis. Si un client omet un argument, mais qu'il y a une valeur par défaut fournie dans la signature de la fonction, je veux utiliser cette valeur par défaut.

2voto

gnr Points 682

Pour prendre soin des arguments uniquement par mot-clé (et parce que les valeurs par défaut et kwonlydefaults peuvent être None):

spec = inspect.getfullargspec(func)
defaults = dict(zip(spec.args[::-1], (spec.defaults or ())[::-1]))
defaults.update(spec.kwonlydefaults or {})

0voto

Seraj Ahmad Points 201

En python, tous les arguments avec une valeur par défaut viennent après les arguments sans valeur par défaut. Donc le mappage doit commencer à la fin jusqu'à ce que vous ayez épuisé la liste des valeurs par défaut. D'où la logique:

dict(zip(reversed(args), reversed(defaults)))

donne les valeurs par défaut correctement mappées.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X