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
popmétodo de dictados (comoself.data, es decir{'a':'aaa','b':'bbb','c':'ccc'}, aquí) toma dos argumentos: consulte los documentosEl segundo argumento,,
defaultes lo quepopregresa si el primer argumentokey,, está ausente. (Si llamapopcon un solo argumento,keygenera 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
popelimina la'a'clave, por lo que en el segundopopeldefaultargumento se devuelve realmente (ya'a'que ahora está ausenteb.data).fuente
popun elementodictpero retiene el valor del elemento emergente. Por lo tanto,dict.pop(key)elimina elkeyjunto con el asociado,valuepero también devuelvevalueelkeyque 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:
*argsutiliza?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
popfunción toma al menos dos argumentos. A los dos primeros se les asignan los nombresselfykey; y el resto se rellena en una tupla llamadaargs.Lo que sucede en la siguiente línea cuando
*argsse pasa en la llamada aself.data.popes lo contrario: la tupla*argsse 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;
datapasa a ser undictderecho ahora, por lo queself.data.pop()toma uno o dos parámetros; pero si cambiaradataa un tipo que tomara 19 parámetros para una llamadaself.data.pop(), no tendría que cambiar la claseaen 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
*argspasará 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.popmétodo se define comopop(key[, default]).Tu método no usa el
defaultparámetro. Pero, al definir su método con*argsy pasar*argsadict.pop(), está permitiendo que la persona que llama use eldefaultparámetro.En otras palabras, debería poder usar el
popmétodo de su clase comodict.pop:fuente
fuente