Déterminer si un paramètre nommé a été adoptée
Je voudrais savoir si il est possible de déterminer si un paramètre de fonction avec une valeur par défaut a été adoptée en Python.
Par exemple, comment ne dict.pop de travail?
>>> {}.pop('test')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'pop(): dictionary is empty'
>>> {}.pop('test',None)
>>> {}.pop('test',3)
3
>>> {}.pop('test',NotImplemented)
NotImplemented
Comment fonctionne la méthode pop déterminer que la première fois qu'une valeur de retour par défaut n'a pas été adopté? Est-ce quelque chose qui ne peut être fait en C?
Grâce
OriginalL'auteur Jake | 2008-11-01
Vous devez vous connecter pour publier un commentaire.
Je suppose que tu veux dire "argument mot-clé" quand vous dites "paramètre nommé".
dict.pop()
n'accepte pas l'argument mot-clé, de sorte que cette partie de la question est discutable.Cela dit, la façon de détecter si un argument est fourni est d'utiliser le
*args
ou**kwargs
de la syntaxe. Par exemple:Avec peu de travail, et à l'aide de la
**kwargs
syntaxe aussi, il est possible d'émuler complètement le python convention d'appel, où les arguments peuvent être fournis par la poste ou par leur nom, et des arguments fournis à plusieurs reprises (par position et nom) cause une erreur.OriginalL'auteur ddaa
La convention est souvent d'utiliser
arg=None
et l'utilisationpour vérifier s'il est réussi ou pas. Permettant à l'utilisateur de passer
None
, qui pourrait être interprété comme si l'argument était pas passé.None
est aussi une véritable valeur pour le paramètre. Exemple estdict.pop
et son comportement lorsque la clé n'est pas trouvée - il renvoie le deuxième paramètre si il est présent, ou soulève KeyError autrement.Dans ce cas, vous pourriez créer une fermeture variable avec un objet.
MISSING = object(); def foo(arg=MISSING): if arg is MISSING: ...
OriginalL'auteur Markus Jarderot
Si tel est précisément le sens de votre question, je pense qu'il n'y a aucun moyen de distinguer entre les 2 qui était dans la valeur par défaut et une 2 qui a été adopté. Je n'ai pas trouver comment réaliser une telle distinction, même dans le inspecter module.
OriginalL'auteur Federico A. Ramponi
Vous pouvez le faire comme ceci:
Voir la documentation Python sur appels pour des informations complètes.
OriginalL'auteur Greg Hewgill
Je ne suis pas certain si je comprends parfaitement ce que vous voulez; cependant:
ne fait que faire ce que vous voulez? Si non, alors que d'autres ont suggéré, vous devez déclarer votre fonction avec la
*args, **kwargs
de la syntaxe et de vérifier dans les kwargs dict pour le paramètre existence.OriginalL'auteur tzot