Déterminer si un paramètre nommé a été passé
-
05-07-2019 - |
Question
Je voudrais savoir s’il est possible de déterminer si un paramètre de fonction avec une valeur par défaut a été passé en Python. Par exemple, comment fonctionne dict.pop?
>>> {}.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 la méthode pop détermine-t-elle que la première fois qu'une valeur de retour par défaut n'a pas été transmise? Est-ce quelque chose qui ne peut être fait qu'en C?
Merci
La solution
Je suppose que vous voulez dire "argument de mot clé", quand vous dites "paramètre nommé". dict.pop ()
n'accepte pas l'argument de mot clé. Cette partie de la question est donc sans objet.
>>> {}.pop('test', d=None)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: pop() takes no keyword arguments
Cela dit, le moyen de détecter si un argument a été fourni consiste à utiliser la syntaxe * args
ou ** kwargs
. Par exemple:
def foo(first, *rest):
if len(rest) > 1:
raise TypeError("foo() expected at most 2 arguments, got %d"
% (len(rest) + 1))
print 'first =', first
if rest:
print 'second =', rest[0]
Avec certains travaux, et en utilisant la syntaxe ** kwargs
, il est également possible d'émuler complètement la convention d'appel python, dans laquelle les arguments peuvent être fournis par position ou par nom, et les arguments fournis plusieurs fois. (par position et nom) provoque une erreur.
Autres conseils
La convention est souvent d'utiliser arg = None
et d'utiliser
def foo(arg=None):
if arg is None:
arg = "default value"
# other stuff
# ...
pour vérifier s'il a été adopté ou non. Permettre à l'utilisateur de passer None
, ce qui serait interprété comme si l'argument était pas passé.
Vous pouvez le faire comme ceci:
def isdefarg(*args):
if len(args) > 0:
print len(args), "arguments"
else:
print "no arguments"
isdefarg()
isdefarg(None)
isdefarg(5, 7)
Consultez la documentation Python sur les appels pour obtenir des informations complètes.
def f(one, two=2):
print "I wonder if", two, "has been passed or not..."
f(1, 2)
Si tel est le sens exact de votre question, je pense qu’il n’ya aucun moyen de faire la distinction entre un 2 qui était dans la valeur par défaut et un 2 qui a été passé. Je n'ai pas trouvé comment accomplir une telle distinction, même dans le inspecter module.
Je ne suis pas sûr de bien comprendre ce que vous voulez. cependant:
def fun(arg=Ellipsis):
if arg is Ellipsis:
print "No arg provided"
else:
print "arg provided:", repr(arg)
cela fait-il ce que vous voulez? Sinon, comme d'autres l'ont suggéré, vous devez déclarer votre fonction avec la syntaxe * args, ** kwargs
et vérifier dans le dict de kwargs l'existence du paramètre.