2016-10-28 6 views
1

konventionelle Art und Weise der mit optionaler Liste Argumenten zu tun ist folgende:optionale Liste Argument "list = Liste oder []" in Python

def func(list_of_vals = None): 
    if list_of_vals is None: 
     list_of_vals = [] 
    ... 

I wounder, wenn die folgende (kürzere) Version alle Tücke? Warum macht das niemand? wird es als obskurer betrachtet?

list_of_vals = list_of_vals or [] 
+3

Ich mache das, ich denke, es ist großartig. Menschenwürdige Python-Programmierer werden es verstehen. Aber mit 'l' als Variablenname, das ist schlecht. –

+0

@AlexHall, sicher, das ist nur ein Beispiel Code, um eine Idee zu veranschaulichen –

+0

Dies ist sehr häufig. Es ist Standard in JS auch. Tatsächlich kompilieren Standardargumente in Typescript in den obigen Code, aber in JS. Jeder, der auch nur im Entferntesten die Sprache beherrscht, weiß genau, was Sie tun. – Carcigenicate

Antwort

3

None mit der if-Anweisung kombiniert Verwenden hierfür üblich ist, ist es bekannt Python-Entwickler und hat keine seltsamen Grenzfälle. Meine Empfehlung ist nur Stick mit der Konvention.

Ihr Vorschlag hier einen or Betrieb mit abweicht logisch von der herkömmlichen Lösung für die Ränder Fälle, in denen bool(list_of_vals) == False aber list_of_vals is not None, so würde ich gegen mit, dass empfehlen.

Eine weitere mögliche Option ist ein leeres Tupel zu verwenden:

def a(vals=()): 
    ... 

Da Tupel unveränderlich ist, hat dies keine der Gefahren der wandelbaren Standardliste. Es gibt viele Anwendungsfälle, in denen Sie nur den Eingabecontainer durchlaufen und indexieren müssen, und vals kann glücklich als ein Tupel bleiben.

Wenn Sie tatsächlich eine Liste innerhalb des Hauptteils der Funktion benötigen, zum Beispiel müssen Sie Elemente anhängen oder aufschnappen, dann fügen Sie vals = list(vals) als erste Zeile der Funktion hinzu.

+1

Ich habe das Gefühl, wenn der Typ der typischen Werte, die an die Funktion übergeben werden ('list'), sich vom Standardwerttyp (' tuple') unterscheidet, ist das vielleicht noch irreführender –

+0

Das ist eine ausgezeichnete Idee. Es wird nicht funktionieren, wenn erwartet wird, dass die übergebene Liste von der Funktion modifiziert wird (was für ein optionales Argument seltsam wäre), aber ansonsten wird sogar die Unveränderlichkeit vorgeschlagen, die ein Plus ist. – zvone

+0

@BenUsman Eine gute Python-Funktion sollte den Typ des Arguments sowieso so wenig wie möglich berücksichtigen. – zvone

1

Es gibt zwei Fälle, die Sie wollen, dass die Liste kann außerhalb der Funktion verändert werden, dann ist die zweite Variante verhindert a mit Aufruf:

some_list = [] 
a(some_list) 
print(some_list) 

Wenn Sie den Wechsel der Liste Parameter verhindern wollen, sollten Sie Machen Sie eine Kopie innerhalb a

def a(l=()): 
    l = list(l)