В Python, что делает dict.pop (a, b) средний?

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) ←------, почему там второй аргумент?

83
задан bernie 2 January 2010 в 07:18
поделиться

4 ответа

Метод 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 ).

111
ответ дан 24 November 2019 в 08:52
поделиться

Здесь так много вопросов. Я вижу как минимум два, может быть, три:

  • Что делает pop (a, b)? / Почему здесь второй аргумент?
  • Для чего используется * 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 параметров.

27
ответ дан 24 November 2019 в 08:52
поделиться
>>> 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')
>>> 
6
ответ дан 24 November 2019 в 08:52
поделиться
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
5
ответ дан 24 November 2019 в 08:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: