![](https://secure.gravatar.com/avatar/e88b046bd99c34714b60a04eaf51d334.jpg?s=120&d=mm&r=g)
Michael Ströder 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).
Meiner Meinung nach ist sowieso if var is None: var = {} /noch/ besser ;)
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?
Zum Beispiel "vergisst" deine Variante von foo() den Typ des Arguments, wenn es sich um ein leeres Dictionary handelt:
def foo(var=None): ... var = var or {} ... var["result"] = type(var)() ... return var ... assert type(foo({1: 2})["result"]) is dict assert type(foo({})["result"]) is dict assert type(foo(OrderedDict([(1,2)]))["result"]) is OrderedDict assert type(foo(OrderedDict([]))["result"]) is OrderedDict Traceback (most recent call last): File "<stdin>", line 1, in <module> AssertionError