Nice programing

파이썬에서 dict.pop (a, b)는 무엇을 의미합니까?

nicepro 2020. 10. 7. 08:18
반응형

파이썬에서 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) ← ------ 왜 두 번째 논쟁이 있습니까?


popdicts 메서드 ( 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.


여기에 많은 질문이 있습니다. 나는 적어도 2 개, 아마도 3 개를 본다.

  • pop (a, b)는 무엇을합니까? / 두 번째 주장이있는 이유는 무엇입니까?
  • 무엇을 *args위해 사용되고 있습니까?

첫 번째 질문은 Python 표준 라이브러리 참조 에서 간단하게 답변됩니다 .

pop (key [, 기본값])

키가 사전에 있으면 제거하고 해당 값을 반환하고 그렇지 않으면 기본값을 반환합니다. 기본값이 제공되지 않고 키가 사전에 없으면 KeyError가 발생합니다.


두 번째 질문은 Python Language Reference 에서 다룹니다 .

"* identifier"형식이 있으면 초과 위치 매개 변수를 수신하는 튜플로 초기화되며 기본값은 빈 튜플입니다. "** identifier"형식이 있으면 초과 키워드 인수를받는 새 사전으로 초기화되며 기본값은 새 빈 사전입니다.

즉, pop함수는 적어도 두 개의 인수를 사용합니다. 처음 두 사람은 이름 selfkey; 나머지는라는 튜플에 채워집니다 args.

*args에 대한 호출에서가 전달 될 때 다음 줄에서 일어나는 일은 self.data.pop이것의 반대입니다. 튜플 *args은 전달되는 위치 매개 변수로 확장됩니다. 이것은 Python Language Reference에 설명되어 있습니다 .

구문 * expression이 함수 호출에 나타나면 expression은 시퀀스로 평가되어야합니다. 이 시퀀스의 요소는 추가 위치 인수 인 것처럼 처리됩니다.

요컨대, a.pop()은 (는) 유연하고 임의의 수의 위치 매개 변수를 허용하여 알 수없는 수의 위치 매개 변수를에 전달할 수 있습니다 self.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전달 된 인수 배열이됩니다. 이를 통해 얼마나 많은 인수가 전달 될지 미리 알지 않고도 함수가 작동 할 수 있습니다.

You do this with keyword arguments too, using **kwargs:

def func2(**kwargs): 
    pass

See: Arbitrary argument lists


In your case, you've defined a class which is acting like a dictionary. The dict.pop method is defined as pop(key[, default]).

Your method doesn't use the default parameter. But, by defining your method with *args and passing *args to dict.pop(), you are allowing the caller to use the default parameter.

In other words, you should be able to use your class's pop method like 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

참고URL : https://stackoverflow.com/questions/1990802/in-python-what-does-dict-popa-b-mean

반응형