파이썬에서 **의 이름은 무엇입니까?


59

파이썬을 프로그래밍 할 때 때로는 **변환을하기 위해 수행합니다 . 나는 그것이 무엇을하지만 어떤 데이터 구조를 조작하고 있는지 이해합니까? A dict와 다른 것은 무엇입니까? array? **운영자 의 이름이 있습니까?


3
지수 연산자?
Rook

12
에 대한 두 가지 의미가 **있습니다. 힘과 "키워드 인수 사전". 무슨 말을하는거야? "** 식별자"형식이 있으면 초과 키워드 인수를 수신하는 새 사전으로 초기화되며 기본값은 새 빈 사전이됩니다. " 그들 중 어느 것이 귀하의 질문과 관련이 있습니까?
S.Lott

"키워드 인수 사전"은 내가 요구 한 것입니다. 의견 주셔서 감사합니다.
Niklas Rosencrantz

답변:


86

이것은 연산자가 아니므로 실제로 이름이 없지만 "구문 규칙"으로 정의됩니다 . 따라서 다음과 같이 호출해야합니다.

  • "키워드 인수 압축 풀기 구문"

당신이 인수 목록이있는 경우 *args,이라고 "인수 풀기" 같은 방식으로 **kwargs호출 "키워드 인수 풀고" .

당신이의 왼쪽에 그것을 사용하는 경우 =, 같은에서 a, *middle, end = my_tuple, 당신은 말할 것 "튜플 풀고" .

전체적으로 세 가지 유형의 (단일 매개 변수) 인수가 있습니다.

def f(x)  # x: positional argument
def f(x, y=0)  # y: keyword argument
def f(x, *xs, y=0)  # y: keyword-only argument

*args인수는 "변수 위치 매개 변수"를 호출 **kwargs은 "변수 키워드 매개 변수"입니다. 가변 위치 매개 변수는 전달한 모든 인수를 사용하므로 키워드 전용 인수는 위치 적으로 지정할 수 없습니다.

이 중 대부분은 PEP 03623102 와 문서 의 제어 흐름 섹션 에서 찾을 수 있습니다 . 함수 시그니처 오브젝트 PEP는 초안 일 뿐이며 용어는 한 사람의 아이디어 일 수 있습니다. 그러나 어쨌든 그들은 좋은 용어입니다. :)

따라서 *and **인수는 해당 데이터 구조의 압축을 풉니 다.

args = (1, 2, 3)  # usually a tuple, always an iterable[1]

f(*args)  f(1, 2, 3)

# and 

kwargs = {"a": 1, "b": 2, "c": 3}  # usually a dict, always a mapping*

f(**kwargs) -> f(a=1, b=2, c=3)

[1] : 반복 가능 객체는 객체 구현 __iter__()방법 및 맵핑 구현 객체 keys()__getitem__(). 이 프로토콜을 지원하는 모든 객체는 생성자 tuple()및에 의해 이해 dict()되므로 인수의 압축을 풀 때 사용할 수 있습니다.


3
다른 사람이 혼란 스러울 경우 def f(x, *xs, y=0): pass유효한 Python 2. {5,6,7} 구문이 아니며 def f(x, y=0, *xs):예상대로 하지 않습니다 . AFAIK는 의도 한 효과를 달성 할 수있는 유일한 방법입니다 def f(x, *xs, **kw): y=kw.get('y', 0); del kw; .... Python 3은 원래 구문을 예상대로 처리합니다.
chbrown

1
우리가하고있는 동안 : begin, *middle, end = (0, 1, 2, 3, 4, 5)구문은 Python 2.x에서도 작동하지 않습니다.
Stefano Palazzo

이 답변은 Python 3.5 이상에서는 올바르지 않습니다. PEP-448은 ** 연산자를 사전 포장 풀기 연산자로 지정합니다. 참조 python.org/dev/peps/pep-0448
devnul3

13

이름이 없다고 생각합니다. 에서 파이썬 문서 "인수 목록을 풀기"에서, 그것은 단지라고 있어요 "를 **-operator."

"다른"데이터 구조가 무엇을 의미하는지 잘 모르겠습니다. 당신이 할 경우 f(**kwargs)에는 사전에 압축 해제 kwargs키 - 값 쌍의 순서로한다. 다른 구조가 관련된 것을 보지 못했습니다.

명확성을 위해 위의 문서에서 예제 를 복사합니다 .

>>> def parrot(voltage, state='a stiff', action='voom'):
...     print "-- This parrot wouldn't", action,
...     print "if you put", voltage, "volts through it.",
...     print "E's", state, "!"
...
>>> d = {"voltage": "four million", "state": "bleedin' demised", "action": "VOOM"}
>>> parrot(**d)
-- This parrot wouldn't VOOM if you put four million volts through it. E's bleedin' demised !

참조 : * 인수와 ** kwargs로는 무엇을 의미합니까?


독자가 해석 할 수있는 몇 가지 가능한 방법이 있습니다 f(**kwargs).
Deer Hunter

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.