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 que existe um segundo argumento?
python
dictionary
zjm1126
fonte
fonte
help(b.data.pop)
no REPL.Respostas:
O
pop
método de dicts (comoself.data
, isto é{'a':'aaa','b':'bbb','c':'ccc'}
, aqui) leva dois argumentos - veja a documentaçãoO segundo argumento,,
default
é o quepop
retorna se o primeiro argumentokey
,, estiver ausente. (Se você chamarpop
com apenas um argumentokey
,, ele gerará uma exceção se essa chave estiver ausente).Em seu exemplo,
print b.pop('a',{'b':'bbb'})
isso é irrelevante porque'a'
é uma chave emb.data
. Mas se você repetir essa linha ...:você verá que faz diferença: o primeiro
pop
remove a'a'
chave, então no segundopop
odefault
argumento é realmente retornado (já que'a'
agora está ausente deb.data
).fonte
pop
um elemento,dict
mas retém o valor do elemento exibido. Portanto,dict.pop(key)
remove okey
junto com o associado,value
mas também retorna ovalue
dokey
que acabou de ser removido. Achei útil ...pop()
- comportamento comum em mais linguagens como JavaScript, PHP, Java, embora nem todas as linguagens façam isso - por exemplo, C ++.Tantas perguntas aqui. Eu vejo pelo menos dois, talvez três:
*args
sendo usado?A primeira pergunta é trivialmente respondida na referência da Biblioteca Padrão do Python :
A segunda pergunta é abordada na Referência da linguagem Python :
Em outras palavras, a
pop
função leva pelo menos dois argumentos. Os dois primeiros recebem os nomesself
ekey
; e o resto é colocado em uma tupla chamadaargs
.O que acontece na próxima linha quando
*args
é transmitido na chamada deself.data.pop
é o inverso disso - a tupla*args
é expandida para dos parâmetros posicionais que são transmitidos. Isso é explicado na Referência da linguagem Python :Resumindo,
a.pop()
quer ser flexível e aceitar qualquer número de parâmetros posicionais, de modo que possa passar esse número desconhecido de parâmetros posicionais paraself.data.pop()
.Isso lhe dá flexibilidade;
data
passa a ser umdict
agora e, portanto,self.data.pop()
leva um ou dois parâmetros; mas se você mudardata
para um tipo que usa 19 parâmetros para uma chamada para,self.data.pop()
você não terá que mudar de classea
. Você ainda teria que alterar qualquer código chamadoa.pop()
para passar os 19 parâmetros necessários.fonte
Quando você define uma função dessa maneira,
*args
um array de argumentos é passado para a função. Isso permite que sua função funcione sem saber com antecedência quantos argumentos serão passados para ela.Você também faz isso com argumentos de palavra-chave, usando
**kwargs
:Veja: Listas de argumentos arbitrários
No seu caso, você definiu uma classe que funciona como um dicionário. O
dict.pop
método é definido comopop(key[, default])
.Seu método não usa o
default
parâmetro. Mas, ao definir seu método com*args
e passar*args
paradict.pop()
, você está permitindo que o chamador use odefault
parâmetro.Em outras palavras, você deve ser capaz de usar o
pop
método de sua classe comodict.pop
:fonte
fonte