Frage

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 Arbeit?

>>> {}.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

Wie funktioniert die Methode pop bestimmt, dass das erste Mal wurde ein Standardrückgabewert nicht bestanden? Ist dies etwas, das nur in C kann getan werden?

Danke

War es hilfreich?

Lösung

Ich denke, man „Stichwort Argument“ bedeuten, wenn Sie „benannten Parameter“ sagen. dict.pop() nicht Keyword-Argument akzeptieren, so dass dieser Teil der Frage ist 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 zu erkennen, ob ein Argument zur Verfügung gestellt 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, vollständig die Python-Aufrufkonvention zu emulieren, wo Argumente können entweder durch die Position zur Verfügung gestellt werden oder mit Namen und Argumenten zur Verfügung gestellt mehr Male (von Position und Namen) einen Fehler verursachen .

Andere Tipps

Die Konvention ist oft arg=None verwenden und

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

überprüfen, ob es übergeben wurde oder nicht. So dass der Benutzer None passieren, die als interpretiert werden würden, wenn das Argument ist nicht übergeben.

Sie können es tun, wie folgt:

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

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

Sehen Sie die Python-Dokumentation auf für vollständige Informationen nennt .

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 zu unterscheiden, die in dem Standardwert war und ein 2, die vergangen ist. Ich habe nicht gefunden, wie eine solche Unterscheidung zu erreichen, auch in der inspizieren Modul.

Ich bin nicht sicher, ob ich voll und ganz verstehen, was es Sie wollen; jedoch:

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

nicht das tun, was Sie wollen? Wenn nicht, dann wie andere vorgeschlagen haben, sollten Sie Ihre Funktion mit der *args, **kwargs Syntax deklarieren und prüfen Sie in der kwargs dict für den Parameter Existenz.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top