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)
←------, почему там второй аргумент?
Метод pop
диктовок (например, self.data
, то есть {'a': 'aaa', 'b': 'bbb', 'c' : 'ccc'}
, здесь) принимает два аргумента - см. docs
Второй аргумент, default
, это то, что pop
возвращает, если первый аргумент ключ
отсутствует.
(Если вы вызываете 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
).
Здесь так много вопросов. Я вижу как минимум два, может быть, три:
* args
? На первый вопрос тривиальный ответ дан в справочнике по стандартной библиотеке Python :
pop (key [, default])
Если ключ находится в словаре, удалите его и верните его значение, иначе верните значение по умолчанию. . Если значение по умолчанию не указано и ключ отсутствует в словаре, возникает ошибка KeyError.
Второй вопрос рассматривается в Справочнике по языку Python :
Если присутствует форма «* идентификатор», он инициализируется получением кортежа любые лишние позиционные параметры, по умолчанию пустой кортеж. Если форма «** идентификатор» присутствует, это инициализирован новым словарем получение любого лишнего ключевого слова аргументы, по умолчанию новый пустой толковый словарь.
Другими словами, функция pop
принимает как минимум два аргумента. Первым двум присваиваются имена self
и key
; а остальные помещаются в кортеж с именем args
.
То, что происходит в следующей строке, когда * args
передается в вызове self.data.pop
, обратное этому - кортеж * args
расширяется до передаваемых позиционных параметров. Это объясняется в Справочнике по языку Python :
Если синтаксис * выражение появляется в вызов функции, выражение должно оценить последовательность. Элементы из эта последовательность рассматривается, как если бы они были дополнительными позиционными аргументами
Короче говоря, a.pop ()
хочет быть гибким и принимать любое количество позиционных параметров, чтобы он мог передать это неизвестное количество позиционных параметров себе .data.pop ()
.
Это дает вам гибкость; data
сейчас оказывается dict
, поэтому self.data.pop ()
принимает один или два параметра; но если вы измените data
на тип, который принимает 19 параметров для вызова self.data.pop ()
, вам не придется менять класс a
вообще. Тем не менее, вам все равно придется изменить любой код, вызывающий a.pop ()
, чтобы передать необходимые 19 параметров.
>>> 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')
>>>
def func(*args):
pass
, когда вы определяете функцию таким образом, * args
будет массив аргументов передается на функцию. Это позволяет вашей функции работать, не зная, сколько аргументов будет передаваться ему.
Вы делаете это с аргументами ключевых слов, используя ** Kwargs
:
def func2(**kwargs):
pass
см.: Списки произвольного аргумента
в вашем случае, вы определили класс, который действует как словарь. Метод DICP.POP
определяется как POP (ключ [, по умолчанию])
.
Ваш метод не использует параметр по умолчанию
. Но, определяя ваш метод с * args
и прохождение * args
- DICP.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