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)
← ------ ¿por qué hay un segundo argumento?
python
dictionary
zjm1126
fuente
fuente
help(b.data.pop)
en REPL.Respuestas:
El
pop
método de dictados (comoself.data
, es decir{'a':'aaa','b':'bbb','c':'ccc'}
, aquí) toma dos argumentos: consulte los documentosEl segundo argumento,,
default
es lo quepop
regresa si el primer argumentokey
,, está ausente. (Si llamapop
con un solo argumento,key
genera una excepción si esa clave está ausente).En su ejemplo,
print b.pop('a',{'b':'bbb'})
esto es irrelevante porque'a'
es una claveb.data
. Pero si repites esa línea ...:verá que hace una diferencia: el primero
pop
elimina la'a'
clave, por lo que en el segundopop
eldefault
argumento se devuelve realmente (ya'a'
que ahora está ausenteb.data
).fuente
pop
un elementodict
pero retiene el valor del elemento emergente. Por lo tanto,dict.pop(key)
elimina elkey
junto con el asociado,value
pero también devuelvevalue
elkey
que acaba de eliminarse. Lo encontré útil ...pop()
- comportamiento común en más lenguajes como JavaScript, PHP, Java, aunque no todos los lenguajes hacen eso - por ejemplo, C ++.Tantas preguntas aquí. Veo al menos dos, tal vez tres:
*args
utiliza?La primera pregunta se responde de manera trivial en la referencia de la biblioteca estándar de Python :
La segunda pregunta se cubre en la Referencia del lenguaje Python :
En otras palabras, la
pop
función toma al menos dos argumentos. A los dos primeros se les asignan los nombresself
ykey
; y el resto se rellena en una tupla llamadaargs
.Lo que sucede en la siguiente línea cuando
*args
se pasa en la llamada aself.data.pop
es lo contrario: la tupla*args
se expande a los parámetros posicionales que se transmiten. Esto se explica en la Referencia del lenguaje Python :En resumen,
a.pop()
quiere ser flexible y aceptar cualquier número de parámetros posicionales, de modo que pueda pasar este número desconocido de parámetros posicionalesself.data.pop()
.Esto le da flexibilidad;
data
pasa a ser undict
derecho ahora, por lo queself.data.pop()
toma uno o dos parámetros; pero si cambiaradata
a un tipo que tomara 19 parámetros para una llamadaself.data.pop()
, no tendría que cambiar la clasea
en absoluto. Sin embargo, aún tendría que cambiar cualquier código que llamea.pop()
para pasar los 19 parámetros requeridos.fuente
Cuando defina una función de esta manera, se
*args
pasará una matriz de argumentos a la función. Esto permite que su función funcione sin saber de antemano cuántos argumentos se le pasarán.También hace esto con argumentos de palabras clave, usando
**kwargs
:Ver: listas de argumentos arbitrarios
En su caso, ha definido una clase que actúa como un diccionario. El
dict.pop
método se define comopop(key[, default])
.Tu método no usa el
default
parámetro. Pero, al definir su método con*args
y pasar*args
adict.pop()
, está permitiendo que la persona que llama use eldefault
parámetro.En otras palabras, debería poder usar el
pop
método de su clase comodict.pop
:fuente
fuente