본문 바로가기
목차
Python

[Py] double asterisk 사용법-packing and unpacking

by ds31x 2025. 7. 16.
728x90
반응형

Python의 ** (double asterisk) 연산자는 keyword argument와 dictionary unpacking 에 사용됨.

chatgpt에서 잘려서 나왔음. 다시그려야할 듯.

파이썬에서 ** (더블 애스터리스크, 또는 더블 스타) 연산자는 다음의 역할을 수행함:

  • dict 객체 관련 연산
  • function 정의와 호출 시 keyward arguments를 유연하게 처리 (packing 과 unpacking)

**kwargs: 함수 정의 시 variable keyword parameter (가변 키워드 매개변수) 정의 (Packing)

function(함수)를 정의(definition)할 때 parameter(매개변수) 이름 앞에 **를 붙이면, 해당 function은 개수에 제한 없이 keyword arguments를 받을 수 있게 됨..

이러한 arguments는 함수 내부에서 dict 객체로 수집함.

  • variable keyword arguments를 dict객체로 수집:
    • 예를 들어, func_kwargs(**kwargs)와 같은 function definition에서,
    • func_kwargs(key1=1, key2=2, key3=3)와 같이 함수를 호출(call)하면,
    • 이 keyword arguments는 {'key1': 1, 'key2': 2, 'key3': 3}과 같은 dict 객체로 kwargs 변수에 저장됨.
  • 이름의 관례:
    • **kwargs는 주로 사용되는 관례적인 이름임.
    • **words처럼 다른 이름을 사용해도 상관없음.
    • 중요한 것은 ** 연산자의 사용임.
  • 다른 parameters와의 사용:
    • **kwargs는 일반적인 positional parameters 및 variable positional parameter인 *args와 함께 사용될 수 있음
    • 하지만 함수 정의 시 `kwargs`는 반드시 마지막 매개변수로 위치해야 함**.
    • 만약 뒤에 다른 parameter(매개변수)가 오면 SyntaxError가 발생.
    • parameter매개변수의 올바른 순서는 표준 인자 -> *args 인자 -> `kwargs` 인자** 임.
    • 이 순서를 지키지 않으면 오류가 발생할 수 있음.

**: 함수 호출 및 딕셔너리 언패킹 (Unpacking)

** 연산자는 함수를 호출(call)할 때 dict의 키-값 쌍을 개별 keyword argument로 풀어서 전달하는 데 사용됨.

  • function call 시 dict 객체 unpakcing:
    • dict 객체 앞에 **를 붙여 function call을 수행하면,
    • dict 객체의 내용이 풀어져서 각각 함수의 keyword argument로 전달됨
    • 예를 들어 d = {'arg1': 100, 'arg2': 200}이라는 dict 객체가 있을 때,
    • func_kwargs_positional(**d)처럼 호출하면
    • arg1=100, arg2=200과 같이 전달됨
    • 이 경우, 딕셔너리의 키는 함수의 매개변수 이름과 일치해야 합니다.
  • dictionary 병합:
    • ** 연산자는 여러 딕셔너리의 요소를 하나의 새로운 딕셔너리로 병합하는 데도 활용 가능함.
    • 예를 들어 my_merged_dict = {**my_first_dict, **my_second_dict}
    • dict 객체를 합쳐 새로운 dict 객체를 생성할 수 있음.
  • string formating에서의 활용:
    • str.format() 메서드와 함께
    • **를 사용하면 딕셔너리의 데이터를 깔끔하게 문자열에 삽입할 수 있음.

* (single asterisk)와의 차이점

***는 모두 unpacking operator 이지만, 사용 대상과 목적에 차이점을 가짐.

  • * (single asterisk):
    • list, tuple, string 등 **Iterable 객체의 items를 개별 위치 인자로 unpacking하거나 (function call 시),
    • 숫자가 안 맞는 남은 item들을 tuple 객체로 수집하는 (함수 정의 시 *args) 데 사용됨.
    • assignment 시 *는 초과된 items을 list로 수집 (function call 과 차이점).
  • `` (double asterisk)**:
    • dict 객체에만 사용되며,
    • dictionary의 키-값 쌍을 keyword argument로 풀거나 (function call 시),
    • keyword arguments를 dictionary로 수집하는 (함수 정의 시 `kwargs`) 데 사용됨.

같이 보면 좋은 자료

2023.07.30 - [Python] - [Python] asterisk * 사용하기 : unpacking, packing

 

[Python] asterisk * 사용하기 : unpacking, packing

C언어에서 pointer 연산자인 * (asterisk)는 Python에서 상당히 낯설게 동작한다.(특히, PEP3132, PEP448 등에서 그 기능이 무지 많아져서... --;;) double asterisk ** (이문서에선 다루지 않으나, variable keyword argumen

ds31x.tistory.com

2024.02.04 - [Python] - [Python] Parameter 의 종류 - Slash and Asterisk for Function Parameters

 

[Python] Parameter 의 종류 - Slash and Asterisk for Function Parameters

Function의 헤더에서 parameters 를 정의하는데,해당 parameters 중,어떤 것들이 positional parameters 로만 사용가능한지,어떤 것들이 일반적인 parameters로서 positional parameters 또는 keyword parameters 모두 사용가

ds31x.tistory.com


 

728x90