2012-12-10 4 views
5

Verwenden von Standardargumenten des Formulars x={} führt normalerweise nicht den beabsichtigten Zweck in Python, da Standardargumente gebunden sind, wenn eine Funktion definiert ist, nicht aufgerufen.Was ist die pythonischste Art, ein leeres Wörterbuch als Standardargument zu verwenden?

Die Konvention scheint zu sein, veränderbare Objekte als Standardargumente mit x=None zu setzen und dann zu überprüfen, um beim Aufruf der Funktion die richtigen Voreinstellungen zuzuweisen.

Also, wenn ich x in ein Wörterbuch werfen mag, die standardmäßig leer ist, ich etwas wie die folgenden verwenden würde:

def f(x=None): 
    x = dict(x) if x is not None else {} 

Da jedoch dict jede iterable kann nehmen, kann ich auch diese schreiben prägnantere Version:

def f(x=()): 
    x = dict(x) 

Welche davon ist der "richtige" Ansatz?

Antwort

6

The idiomatische Art ist zu nicht umgewandelt zu dict; Auf diese Weise könnte jemand irgendein Objekt verwenden, das die richtigen Zuordnungsmethoden implementiert.

Also, die meisten pythonic Methode zu verwenden:

def f(x=None): 
    if x is None: 
     x = {} 

und dann nur Mapping-Methoden verwenden.

Also sollten Sie in der Regel keine Argumente zu einem Diktat zu werfen. Sie geben an, dass Ihre API stattdessen ein Mapping-Objekt akzeptiert und erwartet, dass Anrufer das Casting ausführen.

Der einzige Grund, sowohl eine dict als auch eine iterable zu akzeptieren, ist, wenn Sie geordnete Schlüssel/Wert-Paare unterstützen möchten, bei denen doppelte Schlüssel zulässig sind, wie für die urllib.urlencode function. In einem solchen Fall kann eine dict diese Information nicht speichern, und diese Methode wirft das iterable nicht auf ein dict, sondern verwendet das dict als iterable.

1

Es gibt keine richtige oder falsche Antwort hier, aber ich würde sagen, die erste mehr idiomatische ist (das nicht die zweite falsch machen, oder schlecht, oder noch schlimmer, etc.)

Verwandte Themen