프로그래밍백엔드 개발자

Python에서 위치 인자(positional arguments) 및 키워드 인자(keyword arguments)와 관련된 메커니즘은 어떻게 작동합니까? 함수 정의 및 호출 시 인자의 순서에 대한 Nuance는 무엇이며, 위치 전용 및 이름 전용 매개변수는 무엇에 필요한가요?

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

답변.

Python에서는 함수의 매개변수를 네 가지 유형으로 선언할 수 있습니다: 위치 인자, 키워드 인자(keyword), 위치 전용(positional-only) 및 이름 전용(keyword-only). 이들의 차이점은 함수 호출 시 값의 전달 방식에 영향을 미칩니다.

매개변수의 유형

  1. 위치 인자 (보통 첫 번째로 옴): 값이 지정된 순서대로 전달됩니다.
  2. 키워드 인자: 이름을 통해 명시적으로 지정됩니다.
  3. 위치 전용: 기호 / 이전에 선언되며 (Python 3.8+), 이름으로 설정할 수 없습니다.
  4. 이름 전용: * 이후에 선언되며, 키로만 설정할 수 있습니다.
# 모든 유형의 예시 def func(a, b, /, c, *, d, e): print(a, b, c, d, e) func(1, 2, 3, d=4, e=5) # OK # func(a=1, b=2, 3, d=4, e=5) # 오류: a, b는 위치 전용

Nuance

  • 매개변수의 순서: (only-positional) / (positional-or-keyword) * (only-keyword)
  • 인자의 순서가 잘못될 경우 — SyntaxError 또는 TypeError가 발생합니다.
  • *args는 추가 위치 인자를 수집하고, **kwargs는 키워드 인자를 수집합니다.

함정이 있는 질문.

함수 선언의 차이점은 무엇인가:

def f(a, b, c): ... def f(a, b, c=1): ... def f(a, b=1, c=2): ... def f(a=1, b=2, c=3): ...

그리고 이 모든 함수는 위치 인자와 키워드 인자로 호출할 수 있습니까?

답변:

  • def f(a, b, c): 함수는 모든 인수가 필수이므로 키워드 인자만으로 호출할 수 없습니다.
  • 만약 위치 전용으로 정의되지 않은 매개변수인 경우 이름으로 지정할 수 있습니다.
  • 함수가 def f(a, b, /, c):로 선언되었다면 ab는 위치로만 지정할 수 있습니다.

예시:

def f(a, b, c=10): print(a, b, c) f(1, 2) # OK, c=10 기본값 f(a=1, b=2, c=3) # OK # 그러나: def f(a, b, /, c=10): ... f(1, 2) # OK f(a=1, b=2, c=3) # 오류! a와 b는 위치 전용

주제의 미세한 차이에 대한 실제 오류 사례


이야기

개발자가 약속을 기반으로 매개변수를 오직 이름으로만 받는 함수를 구현했습니다: 여러 매개변수가 있는 로깅, 이 중 일부는 선택 사항입니다. 그러나 *를 선언하는 것을 잊어서 사용자들이 위치에 따라 잘못된 순서로 매개변수를 전달하여 잘못된 로깅 및 추적하기 어려운 오류가 발생했습니다.


이야기

REST API 프로젝트에서는 인자의 순서에 대한 명시적 약속이 없었기 때문에(*args를 사용하고 이름으로 매개변수를 제한하지 않음) 새로운 클라이언트 버전 도입 후 요청이 작동하지 않게 되었습니다 - 왜냐하면 args가 변경되었기 때문입니다. 명시적 * 도입 및 이름 전용 매개변수 지정으로 이를 수정했습니다.


이야기

대규모 기업 프로젝트에서 기본 값이 있는 새로운 매개변수로 함수를 확장했지만, 잘못된 호출로 인해 위치 값이 다른 매개변수에 적용되어 데이터 처리가 잘못되었습니다. 매개변수를 이름 전용으로 만들어야 했습니다.