
On May 26, 2013, at 8:57 AM, Michael Ströder <michael@stroeder.com> wrote:
Diez B. Roggisch wrote:
On May 25, 2013, at 12:23 PM, Michael Ströder <michael@stroeder.com> wrote:
Besser wäre
def foo(var = None): var = var or {} [..]
Dann wird nämlich jedes Mal eine neue Dictionary-Instanz erzeugt, falls nur foo() aufgerufen wird.
Und noch besser wäre
var = {} if var is None else var
seit Python 2.5.
Nun, man hat leider nicht immer das Privileg eine einigermaßen aktuelle Python-Version zur Verfügung zu haben (z.B. RHEL5).
Deswegen kann man trotzdem zeigen, wie der Stand der Technik ist (und das seit fast 7 Jahren). Workarounds für besondere Umstände sind davon ja nicht betroffen.
Denn dieses Gefummel mit or und and statt dem ternaeren if führt ebenfalls zu seiner ganz eigenen Klasse von Fehlern.
Welche Fehler sind das genau?
In dem Moment, wo deine Erwartungshaltung bool(o) == False auch von an var übergebenen Objekten erfüllt wird.
def foo(var=None): ... var = var or {} ... print var, type(var) ... foo() {} <type 'dict'> foo("") {} <type 'dict'> class mydict(dict): ... def __nonzero__(self): ... return False … foo(mydict()) {} <type 'dict'>
Das mydict ist natürlich hier etwas konstruiert, aber durchaus realistisch. Diez