프로그래밍파이썬 개발자

파이썬 함수에서 *args와 **kwargs가 어떻게 작동하는지 설명해 주세요. 무엇에 사용되며 잘못 사용 시 어떤 위험이 있고 일반 인수 및 이름이 지정된 인수와 어떻게 올바르게 조합할 수 있나요?

Hintsage AI 어시스턴트로 면접 통과

답변

*args는 임의의 개수의 위치 인수를 튜플로 수집합니다.

**kwargs는 임의의 개수의 이름이 지정된 인수(키=값)를 사전으로 수집합니다.

이것은 유연한 인터페이스를 가진 함수를 작성할 수 있게 해줍니다:

def my_func(a, b, *args, **kwargs): print(a, b) print(args) print(kwargs) my_func(1, 2, 3, 4, x=10, y=20) # 1 2 # (3, 4) # {'x': 10, 'y': 20}

세부 사항:

  • 일반 인수는 처음에 오고 그 다음에 *args, 기본값이 있는 이름이 지정된 인수, 그리고 **kwargs가 함수 선언 시 정확한 순서로 옵니다.
  • *를 통해 시퀀스를 "언팩"할 수 있고, **를 통해 함수 호출 시 사전을 언팩할 수 있습니다.
  • 같은 매개변수를 다시 정의할 수 없습니다 — TypeError가 발생합니다.

함정 질문

기본값이 있는 이름이 지정된 인수와 *args의 순서를 바꿀 수 있나요, 예를 들어:

def foo(a, *args, x=10, **kwargs): pass

혹은 반드시 항상 기본값을 *args 뒤에 두어야 하나요?

답변:

파이썬 3에서는 가능합니다! 이렇게 (파이썬 2에서는 작동하지 않았습니다):

def foo(a, *args, x=10): pass

*args 뒤의 매개변수("키워드 전용 인수")는 기본값을 가질 수 있거나 필수일 수 있으며, 이름을 통해서만 지정할 수 있습니다.

주제에 대한 세부 사항을 몰라서 발생한 실제 오류 예


이야기

잘못된 인수를 *args/**kwargs를 통해 전달

REST API 서비스에서 데이터 마샬링 자동화는 **kwargs를 통해 이루어졌습니다. 불필요한 매개변수가 감지되지 않아 함수는 kwargs에 예상치 못한 값을 받아들여 제어 로직 손실 및 디버깅하기 어려운 버그가 발생하였습니다.


이야기

이름이 지정된 인수 중복

함수를 호출할 때 개발자가 매개변수를 명시적으로 그리고 **kwargs를 통해 동시에 지정했습니다, 예: my_func(a=1, **{"a": 2}). 결과적으로 — TypeError와 서비스가 중단되었습니다.


이야기

위치 인수 또는 이름이 지정된 인수 누락

데코레이터를 작성할 때 매개변수가 잘못 전달되면 (순서와 구조가 준수되지 않음) 원래 함수가 인수의 개수를 제대로 받지 못하게 되어 프로덕션에서 TypeError 호출 오류가 발생하게 되었습니다.