2008-11-01 10 views
12

Ich würde gerne wissen, ob es möglich ist zu bestimmen, ob ein Funktionsparameter mit einem Standardwert in Python übergeben wurde. Zum Beispiel, wie funktioniert dict.pop?Ermitteln, ob ein benannter Parameter übergeben wurde

Wie bestimmt die Pop-Methode, dass beim ersten Mal ein Standard-Rückgabewert nicht übergeben wurde? Ist das etwas, das nur in C gemacht werden kann?

Dank

Antwort

7

Ich denke, Sie meinen "Schlüsselwort Argument", wenn Sie sagen "benannter Parameter". dict.pop() akzeptiert kein Schlüsselwortargument, daher ist dieser Teil der Frage strittig.

>>> {}.pop('test', d=None) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: pop() takes no keyword arguments 

Das heißt, die Art und Weise, ob ein Argument vorgesehen nachzuweisen wurde, ist die *args oder **kwargs Syntax zu verwenden. Zum Beispiel:

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] 

Mit etwas Arbeit und die Verwendung der **kwargs Syntax auch ist es möglich, die Python-Aufrufkonvention vollständig zu emulieren, wo Argumente können entweder nach Position oder nach Namen zur Verfügung gestellt werden, und Argumente mehrfach zur Verfügung gestellt (durch Position und Name) verursachen einen Fehler.

1

Sie es wie folgt tun:

def isdefarg(*args): 
    if len(args) > 0: 
     print len(args), "arguments" 
    else: 
     print "no arguments" 

isdefarg() 
isdefarg(None) 
isdefarg(5, 7) 

finden Sie in der Python-Dokumentation auf calls für vollständige Informationen.

1
def f(one, two=2): 
    print "I wonder if", two, "has been passed or not..." 

f(1, 2) 

Wenn dies die genaue Bedeutung Ihrer Frage ist, glaube ich, dass es keine Möglichkeit gibt, zwischen einem 2, das in dem Standardwert war und ein 2 zu unterscheiden, die vergangen ist. Ich habe selbst im Modul inspect keine solche Unterscheidung getroffen.

1

Ich bin mir nicht sicher, ob ich vollständig verstehe, was Sie wollen; jedoch:

def fun(arg=Ellipsis): 
    if arg is Ellipsis: 
     print "No arg provided" 
    else: 
     print "arg provided:", repr(arg) 

macht das, was Sie wollen? Wenn nicht, dann sollten Sie, wie andere vorgeschlagen haben, Ihre Funktion mit der Syntax *args, **kwargs deklarieren und das Kwargs-Dict für den Parameter Existenz einchecken.

11

Die Konvention ist oft arg=None zu verwenden und

def foo(arg=None): 
    if arg is None: 
     arg = "default value" 
     # other stuff 
    # ... 

verwenden zu überprüfen, ob es oder nicht bestanden wurde. Zulassen, dass der Benutzer None übergibt, was so interpretiert würde, als ob das Argument nicht übergeben worden wäre.

+5

Dies ist nicht sinnvoll, wenn 'None' auch ein sinnvoller Wert für den Parameter ist. Beispiel ist 'dict.pop' und sein Verhalten, wenn der Schlüssel nicht gefunden wird - er gibt den zweiten Parameter zurück, wenn er vorhanden ist, oder er hebt ansonsten KeyError auf. – Kos

+5

In diesem Fall könnten Sie eine Closure-Variable mit einem Objekt erstellen. 'MISSING = object(); def foo (arg = VERMISST): wenn arg fehlt: ... ' –

Verwandte Themen