이미지 출처-모던 자바스크립트 Deep dive
인자는 함수 정의부에 함수 내부에서 사용할 변수들의 이름을 선언한 것
인수는 함수 호출부에서 함수를 호출할 때, 함수 내부로 넘겨주는 값
함수를 호출할 때 인수 뿐만 아니라 매개변수의 이름까지 명시적으로 지정해서 전달하는 방법입니다.
즉 함수 호출부에서 인수 부분에 매개변수의 이름을 함께 써서 전달하는 함수 호출 방법입니다.
def root_formula(a, b, c):
return (-b + (b**2 - 4*a*c)**0.5) / 2*a, (-b - (b**2 - 4*a*c)**0.5) / 2*a
assert root_formula(1,2,1) == (-1, -1)
assert root_formula(a=1, b=2, c=1) == (-1, -1)
이 때, 인수가 모두 키워드로 제공되는 한, 인수의 순서는 상관없습니다.
단, 그렇지 않고 키워드 인수와 위치기반 인수가 겸용되면, 위치기반 인수가 키워드 인수보다 앞서 등장해야 합니다.
root_formula(a=1, 2, 1)
>>> Traceback
SyntaxError : positional argument follows keyword argument
my_kwargs = {
'a' = 1
'b' = 2
'c' = 1
}
이 딕셔너리를 **연산자를 이용해 함수 인수로 넘깁니다.assert root_formula(**my kwargs) == (-1, -1)
my_kwargs = {
'b' = 2
'c' = 1
}
assert root_formula(a=1, **my_kwargs) == (-1, -1)
my_kwargs = {
'a' = 1
}
other_kwargs = {
'b' = 2
'c' = 1
}
assert root_formula(**my_kwargs, **other_kwargs) == (-1, -1)
def print_parameters(**kwargs):
for key, value in kwargs.items():
print(f'{key} = {value}')
print_parameters(alpha=1.5, beta=9, 감마=4) # 한글 parameter도 잘 작동됨.
이는 인수들을 kwargs라는 딕셔너리로 병합하여 함수 내에서 사용한다고 볼 수 있습니다.keyward argument로 함수를 호출하는 것의 장점은 다음과 같습니다.
코드를 읽는 사람들에게 함수 호출의 의미를 명확히 알려줄 수 있습니다. 인수가 함수 내에서 어떤 역할을 하는지 함수 호출부만 보고도 알 수 있습니다.
함수 정의에서 디폴트 값을 지정할 수 있습니다. 이로 인해 코드중복과 시각적 잡음이 줄어듭니다.
기존 호출자에게는 하위호환성1(backward compatibility)을 제공하면서 함수 매개변수를 확장할 수 있는 방법을 제공합니다. 이로 인해 기존 코드를 별도로 마이그레이션2(migration)하지 않아도 기능을 추가할 수 있습니다. 이는 새로운 버그가 생길 여지를 줄어듦을 의미합니다.
1. 하위 호환성(backward compatibility) :
새 기기 또는 소프트웨어를 개발할 때, 이전 기종 또는 OS로도 문제 없이 제대로 실행되는 것
2. 마이그레이션(migration) :
데이터나 소프트웨어를 한 시스템에서 다른 시스템으로 이동하는 것