- 키워드를 사용하면 위치 인자만 사용할 때는 혼동할 수 있는 여러 인자의 목적을 명확히 할 수 있다.
- 선택적 키워드 인자는 항상 위치가 아니라 키워드를 사용해 전달돼야 한다.
-by 파이썬 코딩의 기술 3장 함수 157p '기억해야 할 내용'
가변적인 위치 인자는 가변 인자(varargs) 또는 스타 인자(star args)라고 한다.
이렇게 이름 붙은 이유는 가변 인자의 이름을 *args로 붙이기 때문이다.
만약 함수에 인자로 리스트를 받는데 빈 리스트까지 넘겨야 한다면 코드 잡음이 생긴다. 따라서 이럴 때는 빈 리스트는 생략하는 것이 편한데, 이는 위치 인자 앞에 *을 붙여서 해결할 수 있다.
def log(message, *values):
if not values:
print(message)
else:
values_str = ','.join(str(x) for x in values)
print(f'{message}: {values_str}'
log('안녕') # 안녕
즉, 아래와 같이 *values를 인자로 넣으면 values 값이 없을 경우 에러가 나는 것이 아니라 아무 값도 리턴되지 않는 것이다.
⚡ ' * ' 연산자를 사용하면 가변 인자를 받는 함수에게 시퀀스 내의 원소들을 전달할 수 있다.
⚡ ' *args '를 받는 함수에 새로운 위치 기반 인자를 넣으면 감지하기 힘든 버그가 생길 수 있다.
파이썬 함수에서는 모든 인자를 키워드를 사용해 넘길 수 있다. 즉, 함수 호출시 괄호 내부에서 파라미터 이름을 대입 연산해 사용하면 된다.
이 때, 위치 기반 인자를 지정하려면 키워드 인자보다 앞에 지정해야 한다.
def remainder(number, divisor):
return number & divisor
remainder(number=10, 2) # 에러
remainder(2, divisor=1) # 성공
**연산자는 파이썬이 딕셔너리에 들어 있는 값을 함수에 전달하되, 각 값에 대응하는 키를 키워드로 사용하도록 명령한다.
my_kwargs = {
'number': 20,
'divisor': 10
}
assert remainder(**my_kwargs) == 2 # True
또한, **연산자를 함수의 인자로 여러개 사용하는 것도 가능하다. 단, 각 딕셔너리에 겹치는 키워드들이 없어야 한다!
아무 키워드 인자나 받는 함수를 만들고 싶을 때는 모든 키워드 인자를 dict에 모아주는 **kwargs를 사용한다.
def print_parameters(**kwargs):
for key, val in kwargs.items():
print(f'{key} & {val}')
print_parameters(jihun=10, someone=5, another=7)
>>>
jihun & 10
someone & 5
another & 7
1. 키워드 인자를 사용하면 코드를 처음 보는 사람들에게 함수 호출의 의미를 명확히 알려줄 수 있다.
👉 키워드 인자를 사용한 호출에서 numbers=20과 divisor=7을 보면 어떤 파라미터가 어떤 목적을 가지는지 명확해진다.
2. 함수 정의에서 디폴트 값을 지정할 수 있다.
아래와 같이 유량을 계산하는 함수가 있다고 했을 때, 마지막 측정 값을 가지고 한 시간이나 하루 단위의 유입량을 추정하기 위해 'period' 파라미터를 추가한다고 해보자. 아래와 같이 period=1로 디폴트 설정을 해놓으면 period는 이제 선택적인 인자가 된다. 즉, 인자에 들어가도 되고 안들어가도 된다~
def flow_rate(weight_diff, time_diff, period=1):
return (weight_diff / time_diff) * period
flow_per_period = flow_rate(weight_diff, time_diff)
flow_per_hour = flow_rate(weight_diff, timediff, period=3600) # 키워드 인자를 이용해 선택적 인자 값을 설정했다.
👉 선택적 인자를 지정하는 최선의 방법은 항상 키워드 인자를 사용하고 위치 인자를 절대 사용하지 않는 것이다. 이를 통해 혼동을 최소화 할 수 있다.
3. 어떤 함수를 사용하고 있던 기존 호출자에게는 하위 호환성을 제공하면서 함수 파라미터를 확장할 수 있는 방법을 제공하게 된다.
👉 키워드 파라미터와 그 값을 갖는 디폴트 파라미터를 추가하면 되기 때문이다.
참고
파이썬 코딩의 기술 개정 2판(저자: 브렛 슬라킨)