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)
← ------ почему тут второй аргумент?
python
dictionary
zjm1126
источник
источник
help(b.data.pop)
в REPL.Ответы:
pop
Метод dicts (какself.data
, например{'a':'aaa','b':'bbb','c':'ccc'}
, здесь) принимает два аргумента - см документацииВторой аргумент,
default
это то, чтоpop
возвращается, если первый аргументkey
отсутствует. (Если вы вызываетеpop
только с одним аргументом,key
возникает исключение, если этот ключ отсутствует).В вашем примере
print b.pop('a',{'b':'bbb'})
, это не имеет значения , потому что'a'
является ключевым вb.data
. Но если вы повторите эту строку ...:b=a() print b.pop('a',{'b':'bbb'}) print b.pop('a',{'b':'bbb'}) print b.data
вы увидите , что он делает разницу: первый
pop
Удаляет'a'
ключ, так что во втором аргумент фактически возвращенного (так как в настоящее время отсутствует ).pop
default
'a'
b.data
источник
pop
элемент,dict
но сохранить значение всплывающего элемента. Таким образом,dict.pop(key)
снимаетkey
вместе с соответствующим ,value
но и возвращаетvalue
изkey
который только что был удален. Я нашел это полезным ...pop()
- обычное поведение для большего количества языков, таких как JavaScript, PHP, Java, хотя не все языки делают это - например, C ++.Здесь так много вопросов. Я вижу как минимум два, может, три:
*args
чего используется?На первый вопрос тривиальный ответ дан в справочнике по стандартной библиотеке Python :
Второй вопрос рассматривается в Справочнике по языку Python :
Другими словами,
pop
функция принимает как минимум два аргумента. Первым двум присваиваются именаself
иkey
; а остальные помещаются в кортеж с именемargs
.То, что происходит в следующей строке, когда
*args
передается в вызове,self.data.pop
является обратным этому - кортеж*args
расширяется до позиционных параметров, которые передаются. Это объясняется в Справочнике по языку Python :Короче говоря, он
a.pop()
хочет быть гибким и принимать любое количество позиционных параметров, чтобы он мог передать это неизвестное количество позиционных параметровself.data.pop()
.Это дает вам гибкость;
data
оказываетсяdict
прямо сейчас и поэтомуself.data.pop()
принимает один или два параметра; но если вы изменилиdata
тип, который принимает 19 параметров для вызова,self.data.pop()
вам вообще не придется менять классa
. Однако вам все равно придется изменить любой код, который вызываетсяa.pop()
для передачи необходимых 19 параметров.источник
def func(*args): pass
Когда вы определяете функцию таким образом, в функцию
*args
будет передан массив аргументов. Это позволяет вашей функции работать, не зная заранее, сколько аргументов ей будет передано.Вы также делаете это с аргументами ключевого слова, используя
**kwargs
:def func2(**kwargs): pass
См .: Списки произвольных аргументов
В вашем случае вы определили класс, который действует как словарь.
dict.pop
Метод определяется какpop(key[, default])
.Ваш метод не использует
default
параметр. Но, определяя свой метод с помощью*args
и передавая*args
емуdict.pop()
, вы разрешаете вызывающему объекту использоватьdefault
параметр.Другими словами, вы должны иметь возможность использовать
pop
метод своего класса, напримерdict.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
источник
>>> 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') >>>
источник