Python에서는 함수의 매개변수를 네 가지 유형으로 선언할 수 있습니다: 위치 인자, 키워드 인자(keyword), 위치 전용(positional-only) 및 이름 전용(keyword-only). 이들의 차이점은 함수 호출 시 값의 전달 방식에 영향을 미칩니다.
/ 이전에 선언되며 (Python 3.8+), 이름으로 설정할 수 없습니다.* 이후에 선언되며, 키로만 설정할 수 있습니다.# 모든 유형의 예시 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는 위치 전용
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):로 선언되었다면 a와 b는 위치로만 지정할 수 있습니다.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가 변경되었기 때문입니다. 명시적 * 도입 및 이름 전용 매개변수 지정으로 이를 수정했습니다.
이야기
대규모 기업 프로젝트에서 기본 값이 있는 새로운 매개변수로 함수를 확장했지만, 잘못된 호출로 인해 위치 값이 다른 매개변수에 적용되어 데이터 처리가 잘못되었습니다. 매개변수를 이름 전용으로 만들어야 했습니다.