class a(object):
data={'a':'aaa','b':'bbb','c':'ccc'}
def pop(self, key, *args):
return self.data.pop(key, *args)#what is this mean.
b=a()
print b.pop('a',{'b':'bbb'})
print b.data
self.data.pop(key, *args)
← ------ warum gibt es ein zweites Argument?
python
dictionary
zjm1126
quelle
quelle
help(b.data.pop)
in der REPL wirklich faul sind .Antworten:
Das
pop
Verfahren von dicts (wieself.data
, das heißt{'a':'aaa','b':'bbb','c':'ccc'}
, hier) zwei Argumente - siehe die DokumentationDas zweite Argument
default
gibtpop
zurück, wenn das erste Argumentkey
fehlt. (Wenn Siepop
mit nur einem Argument aufrufen ,key
wird eine Ausnahme ausgelöst, wenn dieser Schlüssel fehlt.)In Ihrem Beispiel
print b.pop('a',{'b':'bbb'})
ist dies unerheblich , da'a'
ist ein Schlüssel inb.data
. Aber wenn Sie diese Zeile wiederholen ...:Sie werden sehen, dass es einen Unterschied macht: Der erste
pop
entfernt den'a'
Schlüssel, so dass im zweitenpop
dasdefault
Argument tatsächlich zurückgegeben wird (da'a'
es jetzt nicht mehr vorhanden istb.data
).quelle
pop
ein Element von benötigt,dict
aber den Wert des gepoppten Elements beibehält. Sodict.pop(key)
entfernt diekey
zusammen mit dem zugehörigen ,value
sondern auch gibt dievalue
von der ,key
die gerade entfernt wurde. Ich fand es nützlich ...pop()
- allgemeinem Verhalten in mehr Sprachen wie JavaScript, PHP, Java erwarte , obwohl dies nicht alle Sprachen tun - zB C ++.So viele Fragen hier. Ich sehe mindestens zwei, vielleicht drei:
*args
verwendet?Die erste Frage wird in der Python Standard Library- Referenz trivial beantwortet :
Die zweite Frage wird in der Python-Sprachreferenz behandelt :
Mit anderen Worten, die
pop
Funktion akzeptiert mindestens zwei Argumente. Den ersten beiden werden die Namen zugewiesenself
undkey
; und der Rest wird in ein Tupel namens gestopftargs
.Was in der nächsten Zeile
*args
passiert , wenn es im Aufruf an weitergegebenself.data.pop
wird , ist das Gegenteil davon - das Tupel*args
wird auf Positionsparameter erweitert, die weitergegeben werden. Dies wird in der Python-Sprachreferenz erläutert :Kurz gesagt,
a.pop()
möchte flexibel sein und eine beliebige Anzahl von Positionsparametern akzeptieren, damit diese unbekannte Anzahl von Positionsparametern an weitergegeben werden kannself.data.pop()
.Dies gibt Ihnen Flexibilität;
data
ist gerade eindict
undself.data.pop()
nimmt entweder einen oder zwei Parameter; Wenn Sie sich jedochdata
in einen Typ ändern würden , der 19 Parameter für einen Aufruf benötigt,self.data.pop()
müssten Sie die Klassea
überhaupt nicht ändern . Sie müssten jedoch jeden Code ändern, der aufgerufen wurdea.pop()
, um die erforderlichen 19 Parameter zu übergeben.quelle
quelle
Wenn Sie eine Funktion auf diese Weise definieren,
*args
wird ein Array von Argumenten an die Funktion übergeben. Auf diese Weise kann Ihre Funktion funktionieren, ohne vorher zu wissen, wie viele Argumente an sie übergeben werden.Sie tun dies auch mit Schlüsselwortargumenten, indem Sie Folgendes verwenden
**kwargs
:Siehe: Beliebige Argumentlisten
In Ihrem Fall haben Sie eine Klasse definiert, die sich wie ein Wörterbuch verhält. Die
dict.pop
Methode ist definiert alspop(key[, default])
.Ihre Methode verwendet den
default
Parameter nicht. Indem Sie Ihre Methode mit definieren*args
und an übergeben*args
,dict.pop()
können Sie dem Aufrufer erlauben, dendefault
Parameter zu verwenden.Mit anderen Worten, Sie sollten in der Lage sein, die
pop
Methode Ihrer Klasse wie folgt zu verwendendict.pop
:quelle