**kwargs
는 인자들을 딕셔너리로 모아 함수에 전달한다.간단히 이해할 수 있는 부분!
# 키워드 인자 **kwargs
def remainder(number, divisor):
return number % divisor
assert remainder(20, 7) == 6
# ok
remainder(20, 7)
remainder(20, divisor=7)
remainder(number=20, divisor=7) # 제일 보기 좋음!
remainder(divisor=7, number=20) # 제일 보기 좋음!
# error!
remainder(number=20, 7) # 키워드 인자가 앞에 있으면 오류!
remainder(20, number=7) # number 인자가 두 번 사용됨!
*
<- asterisk
변수 위치 인자 (*args : arguments)는 튜플을 반환
키워드 인자 (**kwargs : Keyword arguments)는 딕셔너리를 반환
def foo(requires, *args, **kwargs) :
print(requires)
if args :
print(args, type(args))
if kwargs :
print(kwargs, type(kwargs))
foo("hi", 5, a=5)
>>
hi
(5,) <class 'tuple'>
{'a': 5} <class 'dict'>
########################
# 딕셔너리에 있는 값을 각 값에 대응하는 키를 키워드로 사용하며 함수에 전달
def remainder(number, divisor):
return number % divisor
my_kwargs = {
'number': 20,
}
other_kwargs = {
'divisor': 7,
}
# **kwargs 여러번 사용 가능 (겹치지 않는다면)
remainder(**my_kwargs, **other_kwargs)
>>
6
#######################
# 모든 키워드 인자를 받는 함수를 만들 시엔, **kwargs로 dict에 모아준다
def print_parameters(**kwargs):
for key, value in kwargs.items():
print(f'{key} = {value}')
print_parameters(alpha=1.5, beta=9, 감마=4)
>>
alpha = 1.5
beta = 9
감마 = 4
위의 foo
함수를 다음과 같이 호출하면 어떻게 될까?
def foo(requires, *args, **kwargs) :
print(requires)
if args :
print(args, type(args))
if kwargs :
print(kwargs, type(kwargs))
foo("hi", 5, {'a':5})
>>
hi
(5, {'a': 5}) <class 'tuple'>
# 튜플로 묶어버린다... 이걸 해결하려면
foo("hi", 5, **{'a':5})
>>
hi
(5,) <class 'tuple'>
{'a': 5} <class 'dict'>
remainder(20, 7) -> remainder(divisor=7, number=20)
WEIGHT_DIFF = 0.5
TIME_DIFF = 3
def flow_rate(weight_diff, time_diff, period=1): # period 디폴트 값 = 1
return (weight_diff / time_diff) * period
flow_per_second = flow_rate(weight_diff, time_diff) # 생략시 period 디폴트 값 적용
flow_per_hour = flow_rate(weight_diff, time_diff, 3600) # OK
flow_per_hour = flow_rate(weight_diff, time_diff, period=3600) # 추천!
디폴트 인자 설명은 None과 독스트링으로 해결하자! (Better way 24)
WEIGHT_DIFF = 0.5
TIME_DIFF = 3
def flow_rate(weight_diff, time_diff,
period=1, units_per_kg=1): # units_per_kg 인자 추가
return ((weight_diff * units_per_kg) / time_diff) * period
pounds_per_hour = flow_rate(weight_diff, time_diff,
period=3600, units_per_kg=2.2) # 추천
pounds_per_hour = flow_rate(weight_diff, time_diff, 3600, 2.2) # NOPE!
# 책에서는 선택적 인자를 사용 시 위치 인자를 *절대* 사용하지 말라고 함;;
명시적인 키워드 인자 스타일 코드를 사용하자! (Better way 25)
참고자료