Die beste Methode, mit Standardparametern in Python umzugehen?

8

Ich habe Code (den jemand anderes geschrieben hat):

%Vor%

was meiner Meinung nach umgeschrieben werden könnte als:

%Vor%

Das würde natürlich scheitern, wenn jemand in attrs=None übergeben würde, aber ist das etwas zu erwarten? Gibt es eine Strafe für die attrs={} (extra überflüssige Diktat-Erstellung?)

Ich bin Python immer noch zu neu, um diese Fragen zu beantworten, aber ich bin neugierig.

Wenn ich das im Interpreter teste, bekomme ich:

%Vor%

Wie verursacht das jemals ein Problem? Beachten Sie, dass ich IMMER das dict zu den attrs hinzufüge, auch wenn der Benutzer einen angegeben hat (was möglicherweise auf ein anderes Problem hinweist (ich sollte das Klassenattribut wahrscheinlich mit einem vorhandenen verschmelzen, falls vorhanden).

------------------- Und um den Fehler in den obigen zu zeigen ------------------

%Vor%

Scheint immer noch in Ordnung, was ist das Problem?

%Vor%

Ahhh, jetzt verstehe ich es, wenn {'something': 'extra'} durch irgendeinen anderen Code hinzugefügt wird, der niemals aufgeräumt wird. Sicher, die Anziehungspunkte, die ich dort erzwinge, sind da, aber auch die {'something': 'extra'} , die nicht sein sollten. Dies ist subtil genug, um ein gutes Futter für einen Verschleierungswettbewerb zu sein, Ausschau nach PERL!

    
boatcoder 10.08.2011, 20:33
quelle

4 Antworten

13

Die Verwendung von attrs = {} in der Funktionssignatur wird Sie beißen, da dieser Wert bei aufeinanderfolgenden Aufrufen der Funktion beibehalten wird. Der ursprüngliche Code ist am besten.

zB

%Vor%

Beachten Sie, wie der Wert beim ersten Aufruf beim ersten Aufruf beibehalten wurde.

    
Gerrat 10.08.2011, 20:35
quelle
2

Da Ihre Signatur attrs={} angibt, werden alle Benutzer entweder ein Diktat bereitstellen oder dieses Feld nicht verwenden, sodass es {} ist. Daher ist es in diesem Fall fast unmöglich, dass jemand None übergibt - in diesem Fall ist es seine Schuld. In diesem Fall wird das Diktat jedoch über mehrere Anrufe hinweg aktualisiert. Vielleicht möchten Sie das nicht.

Verwenden Sie immer sinnvolle Standardeinstellungen, wenn Sie Standardwerte verwenden.

    
Mihai Maruseac 10.08.2011 20:35
quelle
2

Das Problem ist, dass das Wörterbuch einmal bei der Funktionsdefinition erstellt wird, so dass alle Aufrufe dasselbe Wörterbuch verwenden. Dies ist normalerweise NICHT das beabsichtigte Verhalten, daher die Tendenz für Leute, die = None-Version zu verwenden.

    
John Gaines Jr. 10.08.2011 20:36
quelle
2

Ja. Standardargumente werden zur Funktionsdefinitionszeit ausgewertet. Wenn Sie ein veränderbares Standardargument verwenden, wird es immer dasselbe sein. Wenn Sie also attrs ändern, bleibt es unverändert.

    
agf 10.08.2011 20:36
quelle

Tags und Links