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)
← ------ dlaczego jest drugi argument?
python
dictionary
zjm1126
źródło
źródło
help(b.data.pop)
w REPL.Odpowiedzi:
pop
Metoda dicts (jakself.data
, to znaczy{'a':'aaa','b':'bbb','c':'ccc'}
, tutaj) pobiera dwa argumenty - patrz docsDrugi argument,,
default
jest tym, copop
zwraca, jeśli nie ma pierwszego argumentukey
,. (Jeśli wywołaszpop
tylko z jednym argumentem,key
zgłosi wyjątek, jeśli nie ma tego klucza).W twoim przykładzie
print b.pop('a',{'b':'bbb'})
nie ma to znaczenia, ponieważ'a'
jest to kluczb.data
. Ale jeśli powtórzysz tę linię ...:b=a() print b.pop('a',{'b':'bbb'}) print b.pop('a',{'b':'bbb'}) print b.data
zobaczysz to robi różnicę: pierwsze
pop
Usuwa'a'
klucz, więc w drugim argument rzeczywiście zwrócony (ponieważ jest teraz nieobecny ).pop
default
'a'
b.data
źródło
pop
elementu,dict
ale zachować wartość elementu popped. Tak więc,dict.pop(key)
usuwakey
razem ze skojarzonym,value
ale także zwracavalue
wartość,key
która została właśnie usunięta. Przydało mi się ...pop()
- wspólne zachowanie w innych językach, takich jak JavaScript, PHP, Java, chociaż nie wszystkie języki to robią - np. C ++.Tak wiele pytań tutaj. Widzę co najmniej dwa, może trzy:
*args
służy?Na pierwsze pytanie można znaleźć trywialną odpowiedź w dokumentacji Python Standard Library :
Drugie pytanie jest omówione w Python Language Reference :
Innymi słowy,
pop
funkcja przyjmuje co najmniej dwa argumenty. Pierwsze dwa otrzymują nazwyself
ikey
; a reszta jest umieszczana w krotce o nazwieargs
.To, co dzieje się w następnej linii, gdy
*args
jest przekazywane w wywołaniu,self.data.pop
jest odwrotnością tego - krotka*args
jest rozwijana do parametrów pozycyjnych, które są przekazywane dalej. Jest to wyjaśnione w dokumencie Python Language Reference :Krótko mówiąc,
a.pop()
chce być elastyczny i akceptować dowolną liczbę parametrów pozycyjnych, aby mógł przekazać tę nieznaną liczbę parametrów pozycyjnych doself.data.pop()
.Daje to elastyczność;
data
tak się składa, że jest todict
teraz, więcself.data.pop()
przyjmuje jeden lub dwa parametry; ale jeśli zmieniłeśdata
się na typ, który wymagał 19 parametrów dla wywołaniaself.data.pop()
, nie musiałbyś w ogóle zmieniać klasya
. Nadal musiałbyś jednak zmienić dowolny kod, który wywołałbya.pop()
przekazanie wymaganych 19 parametrów.źródło
def func(*args): pass
Gdy zdefiniujesz funkcję w ten sposób,
*args
zostanie przekazana tablica argumentów do funkcji. Dzięki temu Twoja funkcja będzie działać bez wcześniejszej wiedzy, ile argumentów zostanie do niej przekazanych.Robisz to również z argumentami słów kluczowych, używając
**kwargs
:def func2(**kwargs): pass
Zobacz: Dowolne listy argumentów
W twoim przypadku zdefiniowałeś klasę, która działa jak słownik.
dict.pop
Sposób jest zdefiniowany jakopop(key[, default])
.Twoja metoda nie używa tego
default
parametru. Ale definiując metodę*args
zi*args
do niejdict.pop()
, zezwalasz obiektowi wywołującemu na użyciedefault
parametru.Innymi słowy, powinieneś być w stanie użyć
pop
metody swojej klasy, takiej jakdict.pop
:my_a = a() value1 = my_a.pop('key1') # throw an exception if key1 isn't in the dict value2 = my_a.pop('key2', None) # return None if key2 isn't in the dict
źródło
>>> def func(a, *args, **kwargs): ... print 'a %s, args %s, kwargs %s' % (a, args, kwargs) ... >>> func('one', 'two', 'three', four='four', five='five') a one, args ('two', 'three'), kwargs {'four': 'four', 'five': 'five'}
>>> def anotherfunct(beta, *args): ... print 'beta %s, args %s' % (beta, args) ... >>> def func(a, *args, **kwargs): ... anotherfunct(a, *args) ... >>> func('one', 'two', 'three', four='four', five='five') beta one, args ('two', 'three') >>>
źródło