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

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top