it-swarm.com.de

Python, Standard-Schlüsselwortargumente nach Positionsargumenten variabler Länge

Ich dachte, ich könnte benannte Parameter nach Positionsparametern variabler Länge in einem Funktionsaufruf in Python 2 verwenden, aber ich erhalte ein SyntaxError beim Importieren eines python Klasse. Ich schreibe zum Beispiel mit der folgenden "get" -Methode:

class Foo(object):
    def __init__(self):
        print "You have created a Foo."

    def get(self, *args, raw=False, vars=None):
        print len(args)
        print raw
        print vars

Der Fehler sieht so aus:

def get(self, *args, raw=False, vars=None):
                     ^
SyntaxError: invalid syntax

Ich möchte die Methode auf verschiedene Arten aufrufen können:

f = Foo()
f.get(arg1, arg2)
f.get(arg1, raw=True)
f.get(arg1, arg2, raw=True, vars=something)

etc.

77
jkmacc

Es funktioniert, aber nur in Python 3. Siehe PEP 102 . Wenn man sich die "Was ist neu" -Dokumente ansieht, scheint es keinen 2.x-Backport zu geben Sie haben also Pech. Sie müssen alle Schlüsselwortargumente akzeptieren (**kwargs) und sie manuell analysieren. Sie können d.get(k, default) verwenden, um entweder d[k] zu erhalten. oder default, wenn das nicht der Fall ist. Um ein Argument aus kwargs zu entfernen, z. B. vor dem Aufruf einer Superklasse-Methode, verwenden Sie d.pop.


Beachten Sie, dass in def get(self, *args, raw=False, vars=None): die Zeichen raw=False Und vars=None Nichts mit Schlüsselwortargumenten zu tun haben. Dies sind Standardargumentwerte. Argumente mit einem Standardwert können positionell übergeben werden, und Argumente ohne einen Standardwert können als Schlüsselwort übergeben werden:

def f(a=1): pass
f(2)  # works, passing a positionally
def f(a): pass
f(a=2)  # works, passing a by keyword

In ähnlicher Weise müssen Argumente, die nur Schlüsselwörter enthalten, keinen Standardwert haben. Nach dem Argument *args Folgt, was sie als Nur-Schlüsselwort kennzeichnet, nicht das Vorhandensein eines Standardwerts:

def f(*args, a): pass
# a is a mandatory, keyword-only argument
68
user395760

Die Syntax von Python erlaubt keine variablen Argumente in Funktions- und Schlüsselwortargumenten mit gleichzeitigem Standardwert. Wenn Sie Schlüsselwortargumente zusammen mit einer beliebigen Anzahl von Positionsargumenten haben müssen, müssen Sie auch eine beliebige Anzahl von Schlüsselwortargumenten zulassen.

Dies ist ein gängiges Muster, um Standardwerte für Schlüsselwortargumente bereitzustellen und eine beliebige Anzahl von Positionsargumenten zuzulassen:

def foo(*args, **kwargs):
   raw = kwargs.pop('raw', False)
   vars = kwargs.pop('vars', None)

Wenn Sie die zusätzlichen Schlüsselwortargumente überhaupt nicht verwenden, müssen Sie sich keine Sorgen machen. Dies macht die Funktion ein bisschen weniger selbstdokumentierend, was Sie mit einem korrekt geschriebenen Docstring nachholen können.

47
Imran