노트

*args·**kwargs와 언패킹

*args, **kwargs, and Unpacking

CS#python · 연결된 개념 6개

쉽게 말하면

가변 인자 문법은 몇 개가 올지 모르는 인자를 상자 하나에 쓸어 담는 거예요. 이름 없이 온 건 차례대로, 이름표가 붙은 건 이름표째 담고, 반대로 상자를 쏟아 인자로 펼칠 수도 있어요.

비유가 깨지는 곳 아무거나 담기는 상자라서 잘못 쓴 이름도 조용히 들어가 무시되기 쉬워요. 받을 인자가 정해져 있다면 이름을 명시하고, 플래그성 인자는 * 뒤에 두어 키워드 전용으로 만들어요.

*args는 남는 위치 인자(positional argument)를 튜플로, **kwargs는 남는 키워드 인자(keyword argument)를 딕셔너리로 모아 받는 문법이다. 반대로 호출할 때 *·**를 쓰면 시퀀스·딕셔너리를 개별 인자로 펼친다. 모으는 것을 패킹(packing), 펼치는 것을 언패킹(unpacking)이라 한다.

def log(level, *args, sep=" ", **kwargs):
    print(level, sep.join(map(str, args)), kwargs)
 
log("INFO", "user", 42, sep="|", request_id="abc")
# INFO user|42 {'request_id': 'abc'}
 
nums = [1, 2, 3]
opts = {"sep": ", "}
print(*nums, **opts)          # 1, 2, 3

매개변수 순서

def f(a, b=1, *args, c, d=2, **kwargs): ...
#     위치  기본값  가변   키워드 전용   가변 키워드
  • 일반 매개변수 → 기본값 매개변수 → *args → 키워드 전용 매개변수 → **kwargs
  • *args 뒤에 오는 매개변수는 이름으로만 넘길 수 있다(키워드 전용, keyword-only). 가변 인자가 필요 없으면 *만 써서 키워드 전용을 강제한다: def connect(host, *, timeout=5)
  • / 앞의 매개변수는 위치로만 넘길 수 있다(위치 전용, positional-only, 3.8+)
  • 기본값은 정의할 때 한 번만 평가된다. 리스트 같은 변경 가능한 값을 기본값으로 쓰지 않는다(가변 기본 인자 함정)

시퀀스 언패킹(sequence unpacking)

a, b = b, a                    # 교환
first, *rest = [1, 2, 3, 4]    # first=1, rest=[2, 3, 4]
for name, score in zip(names, scores): ...
merged = {**defaults, **overrides}   # 딕셔너리 합치기, 뒤가 이김

쓰임

  • 받은 인자를 그대로 다른 함수에 넘기는 래퍼·데코레이터
  • 협력적 다중 상속에서 각 클래스가 필요한 인자만 꺼내고 나머지를 super()로 넘기기(파이썬 MRO와 super())
  • 플래그성 인자를 키워드 전용으로 만들어 호출부를 읽기 쉽게 하기(플래그 인수)

**kwargs로 아무거나 받으면 잘못된 이름이 조용히 무시되기 쉽다. 받을 인자가 정해져 있다면 이름을 명시하고, 많아지면 매개변수 객체로 묶는다(매개변수 객체 만들기). 자바스크립트의 나머지 매개변수(rest parameters)·전개 문법(spread syntax)과 거의 같다.

출처: Python 튜토리얼: Arbitrary Argument Lists · Special parameters · Unpacking Argument Lists

연결된 개념

이 노트를 가리키는 문서

뜻이 가까운 노트

  • 파이썬 클래스 기초

    파이썬 클래스는 데이터 속성(attribute)과 메서드를 묶은 타입이고, 클래스를 호출해 인스턴스(instance)를 만든다. 메서드의 첫 매개변수 self가 호출한 인스턴스 자신이며, 호출할 때는 파이썬이 자동으로 채워 넘긴다.

  • 파이썬 모듈과 패키지

    파이썬에서 .py 파일 하나가 모듈(module)이고, 모듈을 모은 디렉터리가 패키지(package)다. import는 다른 모듈의 변수·함수·클래스에 접근할 수 있게 해 주고, 모듈은 처음 import될 때 한 번만 실행된 뒤 캐시된다(sys.modules).

  • 파이썬 기본 컬렉션

    파이썬의 기본 컬렉션은 리스트·튜플·딕셔너리·셋 네 가지다. 가장 중요한 구분은 변경 가능 여부(mutable·immutable)와 순서·중복을 어떻게 다루는가다.

  • 리팩터링 기법 카탈로그

    리팩터링 기법을 무엇을 정리하는지에 따라 묶어 본 지도. 기법마다 거의 항상 반대 방향 기법이 짝으로 있어서(추출↔인라인, 올리기↔내리기) 상황에 따라 양쪽으로 오간다. 아래 묶음은 Refactoring.Guru 카탈로그(1판 기반)의 분류를 따랐고, 기법 이름은 2판 기준으로 적었다.

  • 커맨드 패턴

    요청이나 작업을 실행 가능한 객체로 포장하는 패턴. 작업을 값처럼 저장·전달·대기열에 넣을 수 있게 되고, 되돌리기 같은 부가 연산을 붙일 수 있다.

보기 옵션