[Python-de] Neue Instance mit gleichem Typ über eine Variable?

Peter Otten __peter__ at web.de
Di Mai 28 10:48:48 CEST 2013


Michael Ströder wrote:

> Diez B. Roggisch wrote:
>> 
>> On May 26, 2013, at 8:57 AM, Michael Ströder
>> <michael at stroeder.com> wrote:
>>> 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).
> 
> Hat niemand was dagegen gesagt.
> 
>>>> 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.
> 
> Ah, Du meinst wenn Deine Funktion/Methode verschiedene Typen akzeptiert
> (Duck-Typing). In diesem bei mir eher seltenen Fall mache ich sowieso
> immer:
> 
> if var is None:
>     var = {}

Nicht nur bei verschiedenen Typen; ein leeres dict wird ebenfalls von

var = var or {}

durch ein neues ersetzt, das heißt

def foo(x=None):
    if x is None:
        x = {}
    return x

def bar(x=None):
    return x or {}

x = {}
assert x is foo(x) # ok
assert x is bar(x) # error

Das Problem kann man vermeiden, indem man sich an die Konvention hält, dass 
Funktionen, die ihre Argumente verändern, None zurückgeben.



Mehr Informationen über die Mailingliste python-de