Does dict.update eine Funktion argspec beeinflussen?
Frage
import inspect
class Test:
def test(self, p, d={}):
d.update(p)
return d
print inspect.getargspec(getattr(Test, 'test'))[3]
print Test().test({'1':True})
print inspect.getargspec(getattr(Test, 'test'))[3]
Ich würde erwarten, dass die argspec für Test.Test nicht, aber es tut, weil der dict.update zu ändern. Warum?
Lösung
Da dicts sind veränderbare Objekte. Wenn Sie d.update(p)
nennen, mutieren Sie tatsächlich die Standardinstanz des dict. Dies ist ein häufiges Problem; Insbesondere sollten Sie nie ein veränderbares Objekt als Standardwert in der Liste der Argumente verwenden.
Eine bessere Möglichkeit, dies zu tun, ist wie folgt:
class Test:
def test(self, p, d = None):
if d is None:
d = {}
d.update(p)
return d
Andere Tipps
Ein Standardargument in Python wird jedes Objekt gesetzt wurde, wenn die Funktion definiert wurde, auch wenn Sie ein veränderbares Objekt gesetzt. Diese Frage sollte erklären, was das bedeutet und warum Python ist die Frage SO dest Erstaunen in python. das veränderbare Standardargument
Im Grunde genommen das gleiche Standardobjekt wird jedes Mal die Funktion aufgerufen wird, anstatt eine neue Kopie Wesen verwendet, um jedes Mal gemacht. Zum Beispiel:
>>> def f(xs=[]):
... xs.append(5)
... print xs
...
>>> f()
[5]
>>> f()
[5, 5]
Der einfachste Weg, um dies ist Ihr tatsächliches Standardargument None
zu machen, und dann einfach für None
zu überprüfen und eine Standard in der Funktion, zum Beispiel bieten:
>>> def f(xs=None):
... if xs is None:
... xs = []
... xs.append(5)
... print xs
...
>>> f()
[5]
>>> f()
[5]